4、Deployment ★
Deployment:控制 Pod,使 Pod 拥有多副本、自愈、扩缩容 等能力。(工作负载)
4.1 自愈 和 故障转移
应用:某一个 节点宕机后,用 Deployment 部署的容器 会在 另一个 节点 重新启动。
4.1.1 自愈
使用depolyment创建的pod天生自带自愈能力。
# 删除之前的 Pod kubectl get pods kubectl delete pod xxx xxx -n default # 比较下面两个命令有何不同效果? kubectl run mgnginx --image=nginx kubectl create deployment mytomcat --image=tomcat:8.5.68 kubectl get pods # 删了就没了 kubectl delete pod mgnginx -n default # 删了之后,以一个 新的 ID 重新启动了;用 delete 删不掉的 kubectl delete pod mytomcat-xxx -n default # 查看 deployment 创建的资源 kubectl get deploy # 删除 deployment 创建的资源 kubectl delete deploy mytomcat
使用kubectl run创建的pod,没有自愈能力,可以delete掉;然而使用deployment 创建的 Pod 用 kubectl delete 删不掉的,会自愈。
删除 deployment 创建的 Pod,就要使用kubectl delete deploy xxx这个命令才能删除pod。
4.1.2 故障转移
kubectl create deployment mytomcat --image=tomcat:8.5.68 kubectl get pod -owide docker ps | grep xxx docker stop xxx
Restarts,重启次数 + 1。
查看 Pod 所在 的 node
到 所在的 node 服务器 docker stop,回到 master 可以看到 restart + 1, 然后 接着 Running
把 部署节点 的服务器关机,强制关机。
把 一开始所在的 node2 关机后,又在 node1 启了一个。
这样子,k8s 天天 杀 Pod,起 Pod;可以设置一个时间 2min / 5min 等。
4.2 多副本
–replicas:一次性部署多个 Pod。
4.2.1 命令行 创建
# --replicas=3,部署 3个 Pod my-dep kubectl create deployment my-dep --image=nginx --replicas=3 kubectl get deploy kubectl get pod -A -owide
4.2.2 yaml 创建
apiVersion: apps/v1 kind: Deployment metadata: labels: app: my-dep1 name: my-dep1 spec: replicas: 3 selector: matchLabels: app: my-dep1 template: metadata: labels: app: my-dep1 spec: containers: - image: nginx name: mynginx
4.2.3 可视化界面 创建
# 查看部署的 NODE 和 IP kubectl get pod -owide kubectl get deploy
4.3 扩缩容
kubectl scale
上图举出了 扩容,缩容类似。 Kubernetes 可以 动态的 对 Pod 扩缩容
kubectl get deploy kubectl get pod -owide # 扩容 kubectl scale deploy/my-dep --replicas=5 kubectl get pod -owide # 缩容 kubectl scale deploy/my-dep --replicas=2 kubectl get pod -owide kubectl get deploy # 也可以通过 修改 yaml 中的 replicas 来达到 扩缩容 kubectl edit deploy my-dep kubectl get pod kubectl get deploy
将 deploy my-dep 由 3 扩容到 5
将 deploy my-dep 由 5 缩容到 3
修改 yaml 中的 replicas 来达到 扩缩容
kubectl edit deploy my-dep
使用kubernetes dashboard可视化界面 扩缩容进行pod的扩缩容
4.4 滚动更新
类似于 灰度发布,先启动 一个新的 Pod,然后将旧的 Pod 下线
更改 nginx 版本
# 查看之前用的镜像名称(spec.container.name) kubectl get deploy my-dep -oyaml # 改变 my-dep 中 nginx 的版本 (最新 -> 1.16.1) --record 在 rollout histroy 中记录 kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record kubectl rollout status deployment/my-dep
当前 deploy
查看 spec.containers.name,此时镜像是 nginx
更换 nginx 镜像版本
用 kubectl get pod -w 观察过程
之前那旧的 还在,先准备 新的。 可以看到 新的 先 Running 后 在 Terminating 旧的
新开一个选项,用 kubectl get pod -w 观察过程
查看 spec.containers.name,镜像改成 nginx:1.16.1
kubectl get deploy my-dep -oyaml
4.5 版本回退
# 历史记录 kubectl rollout history deployment/my-dep # 查看某个历史详情 kubectl rollout history deployment/my-dep --revision=2 # 回滚(回到上个版本) kubectl rollout undo deployment/my-dep # 观察过程,也是 先 启动新的,在终止旧的 kubectl get pod kubectl get pod -w # 查看 nginx 版本 kubectl get deploy/my-dep -oyaml | grep image # 回滚(回到指定版本) kubectl rollout undo deployment/my-dep --to-revision=2
查看历史版本:
my-dep 回退到 上个版本
kubectl rollout undo deployment/my-dep
kubectl get pods -w 观察过程
查看版本,已经退回到原来的版本。
4.6 其他工作负载
除了Deployment,k8s 还有 StatefulSet 、DaemonSet 、Job 等 类型资源,我们都称为 工作负载
有状态应用使用 StatefulSet 部署,无状态应用使用 Deployment 部署。
无状态的 进容器,有状态的 物理部署(如Mysql、Redis等)
官网文档:https://kubernetes.io/zh/docs/concepts/workloads/controllers/
可视化页面 — 工作负载
5、Service ★
Service:Pod 的服务发现 与 负载均衡;将一组 Pods 公开为 网络服务的抽象方法。(服务)
5.1 ClusterIP
ClusterIP 分配的 IP 在 这里配置。
kubectl expose: 暴露端口,只能在集群内部 通过 ClusterIP 访问。
pod:my-dep-5b7868d854-xbrz7
cd /usr/share/nginx/html echo 'my-dep-5b7868d854-xbrz7' > index.html cat index.html
pod:my-dep-5b7868d854-dbzhc
cd /usr/share/nginx/html echo 'my-dep-5b7868d854-dbzhc' > index.html cat index.html
pod:my-dep-5b7868d854-5sfvn
cd /usr/share/nginx/html echo 'my-dep-5b7868d854-5sfvn' > index.html cat index.html
启动的3个 pod,分别 修改 index.html 演示负载均衡 。
5.1.1 命令行 创建
# kubectl expose 暴露端口,只能在集群内部 ClusterIP 访问。--type=ClusterIP 不传默认就是 ClusterP,target-port 目标端口(源端口) kubectl expose deploy my-dep --port=8000 --target-port=80 # 查看 service,里面有 CLUSTER-IP # kubectl get service 或者 kubectl get svc kubectl get service # 查看 pod 标签 kubectl get pod --show-labels # 删除 kubectl delete svc my-dep
cluster-ip 在集群内都可以调用,无法在外网访问。
删除 service
5.1.2 可视化界面 创建
apiVersion: v1 kind: Service metadata: labels: k8s-app: my-dep-01 name: my-dep-01 spec: selector: k8s-app: my-dep-01 ports: - port: 8000 protocal: TCP targetPort: 80
域名:默认是 服务.所在命名空间.svc, my-dep-01.default.svc
进入到 pod 内部 curl my-dep-01.default.svc:8000 也可以访问。
这个域名只能在 pod 内可以访问。
如果在 外部,访问 域名是不行的。 但是访问 IP 是可以的。
5.2 NodePort
可以在 公网 访问。 这个缺点:暴露出来的端口是 随机的。
# 只能集群内部访问(--type不写 默认 ClusterIP) kubectl expose deploy my-dep-02 --port=8000 --target-port=80 --type=ClusterIP # 集群外部也可以访问 kubectl expose deploy my-dep-02 --port=8000 --target-port=80 --type=NodePort # 查看 kubectl get svc
每个 pod 都开放了 31951 端口。(如果有,则安全组开放)
然后 任何一台 公网的 IP:30948 即可发 负载均衡的访问。