简单的描述kubernets是干嘛的,当我们使用Docker容器集群,例如:10个订单服务,5个用户服务,5个钱包服务,一共二十个容器在宿主机上运行。当我们10个订单服务都映射主机8080端口时,可知主机端口是没有负载均衡的。我们必须通过外部负载均衡来分发到各个容器服务。另外,容器负载量太大挂掉了,我们需要手动维护重启容器,或者做集群扩容。还有版本迭代、回滚。容器的编排、网格化这就是Kubernetes。
为什么要使用kubernetes:
-
自动化容器部署与复制
这里的自动化不是像Jenkins工具一样的部署,这里的自动化举个例子就像:原先使用docker部署,我们每一个容器在启动时都需要docker run一下,如果我要部署一百个容器,那么我要run一百下(或者写个脚本run一百下),k8s的自动化就类似于他帮我们写了个脚本run了一百个容器。 -
随时扩展或收缩容器规模
k8s的收缩容可以根据容器的处理量,自定义配置进行扩容,例如:一个容器的处理量达到了峰值,或者一百个容器达到了峰值。k8s可以依据配置自动帮我们再创建一百个容器来进行处理分流。 -
组织容器成组,提供容器间的负载均衡
k8s的负载均衡名词叫做Service,在k8s中当我们创建了一个容器服务(POD),会发现这个容器是不能被访问的。想要让外界请求,还需要apply一个service,这个service有几种访问策略:
访问模式 | 描述 |
---|---|
ClusterIP | 集群内部容器访问:会生成一个虚拟IP,与POD不在一个网段。 |
NodePort | 主机端口映射:会在宿主机上映射一个端口,供外部应用访问模式。 |
Headless CluserIP | 无头模式,即无IP。 |
LoadBalancer | 使用外部负载均衡(自己搭建nginx等) |
-
快速更新及回滚容器版本
回滚操作:k8s对我们每一次发布的版本都有版本记录,当我们需要回滚时候,只需要一条命令,即可回滚到指定版本。
滚动更新:k8s默认更新模式为滚动更新,即为当更新版本的容器启动成功后,才停止旧版本容器,滚动更新即不中断更新,但是仍然存在请求中断的情况。 -
提供弹性伸缩,如果某个容器失效就进行替换
k8s在检查到某一个POD(容器)不健康时,会自动创建一个新的容器,并且杀掉旧容器。
kubernetes 操作(kubectl)
如何快速创建一个Deployment(快速部署一个服务)
需要准备好自定义的YAML文件
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: extensions/v1beta2
# 指定apply模式
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "0"
description: 描述
labels:
k8s-app: [APP_NAME]
# 部署名称 [APP_NAME]
name: [APP_NAME]
# 指定容器所在命名空间
namespace: [NAMESPACE]
spec:
progressDeadlineSeconds: 600
# 副本数量
replicas: 1
# 修正历史版本量
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: [APP_NAME]
qcloud-app: [APP_NAME]
# 更新策略
strategy:
# 滚动更新
rollingUpdate:
# 最大涌量
maxSurge: 1
# 最大不可用
maxUnavailable: 0
# 更新类型:滚动更新
type: RollingUpdate
template:
metadata:
labels:
k8s-app: [APP_NAME]
spec:
containers:
# 设置容器环境变量
- env:
- name: ENV_NAME
value: /usr/local/xxx/bin
image: [镜像地址]
# 镜像拉取策略:本地没有则去仓库拉
imagePullPolicy: IfNotPresent
# pod Name
name: [APP_NAME]
# 限制CPU核数和内存
#resources:
#limits:
#cpu: "2"
#memory: 4Gi
#requests:
#cpu: 250m
#memory: 1Gi
securityContext:
privileged: false
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
# 容器挂载数据卷(若不需要挂载则删掉volumes)
volumeMounts:
- mountPath: /var/run
name: docker-sock
dnsPolicy: ClusterFirst
imagePullSecrets:
- name: qcloudregistrykey
- name: tencenthubkey
# 重启策略:总是
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
# 宿主机挂载数据卷(若不需要挂载则删掉volumes)
volumes:
- hostPath:
path: /var/run
type: DirectoryOrCreate
name: docker-sock
设置容器地址映射
spec
template
spec
hostAliases:
- hostnames:
- address02
ip: 0.0.0.0
- hostnames:
- address03
ip: 0.0.0.0
- hostnames:
- address04
ip: 0.0.0.0
执行以下命令应用部署:
kubectl apply -f xxx.yml
执行完成后,查看自己的部署结果
kubectl get deploy
get deploy 展示了Deployment列表,部署的POD查看命令
kubectl get pod
get pod列出k8s中所有的POD,如何进入进入容器:
kubectl exec -it [POD名称] /bin/bash
进入容器之后就可以操作你的容器了,如何删除一个POD呢,又如何删除一个Deploy。
# 删除deploy
kubectl delete deploy [Deployment名称]
# 删除pod
kubectl delete pod [POD名称]
查看POD日志
# 查看所有日志
kubectl logs [POD名称]
# 查看五分钟以内的日志
kubeclt logs --since 5m [POD名称]
# 过滤日志
kubectl logs [POD名称] | grep '[过滤字符串]'
Deployment 镜像更新
kubectl set image deploy [deploy名称] [容器名称]=[镜像名称]
Deployment 以及 Service 的 yaml 编辑,通过编辑 yaml 可将最新配置应用到每个POD上
# Deployment
kubectl edit deploy [deploy名称]
# Service
kubectl edit service [service名称]
回滚操作
# 查看一个deploy的所有历史版本
kubectl rollout history deploy [deploy名称]
# 将deploy回滚到上一个版本
kubectl rollout undo deploy [deploy名称]
# 回滚到指定版本,[version]为所有历史版本的版本号
kubectl rollout undo deploy [deploy名称] --to-revision=[version]
查看 Deploy 的状态
kubectl rollout status deploy [deploy名称]
如何快速创建一个Service
需要准备好自定义的YAML文件
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Service
metadata:
annotations:
description: [Service 创建备注]
name: [Service名称]
namespace: [命名空间]
spec:
ports:
# 端口配置
- name: 26001-26001-tcp
port: 26001
protocol: TCP
targetPort: 26001
# 代理配置(指定deploy服务,创建对于此服务的负载均衡)
selector:
k8s-app: [deploy名称]
sessionAffinity: None
# 服务类型:集群内访问
type: ClusterIP
执行应用
kubectl apply -f xxx.yml
创建一个仅集群内访问的Service
kubectl create service clusterip [service名称] --tcp=[service端口]:[容器端口]
创建一个主机端口访问的Service
kubectl create service nodeport [service名称] --tcp=[service端口]:[容器端口]
删除Service
kubectl delete service [Service名称]
整体部署流程为:
- 使用Docker构建镜像
- 将镜像上传至镜像仓库
- 编辑Deploy的yaml文件
- 执行apply应用此部署
- 编辑Service的yaml文件
- 执行apply应用此服务
- 通过Service访问POD