1.4 给应用添加service,执行扩容和滚动更新
本节重点总结:
-
k8s Service三种类型
- ClusterIP(默认)
- NodePort
- LoadBalancer
-
为 nginx Deployment 创建一个 Service,并通过service访问pod
-
Scaling(伸缩)应用程序,将 nginx Deployment 扩容到 4 个副本
-
执行滚动更新
- Rolling Update滚动更新 通过使用新版本的 Pod 逐步替代旧版本的 Pod 来实现 Deployment 的更新,从而实现零停机
k8s Service(服务)简介
- Kubernetes 中的 Service(服务) 提供了这一个抽象层,它选择具备某些特征的 Pod(容器组)并为它们定义一个访问方式
- Service(服务)使 Pod(容器组)之间的相互依赖解耦(原本从一个 Pod 中访问另外一个 Pod,需要知道对方的 IP 地址)
- 一个 Service(服务)选定哪些 Pod(容器组) 通常由 LabelSelector(标签选择器) 来决定。
- 在创建Service的时候,通过设置配置文件中的 spec.type 字段的值,可以以不同方式向外部暴露应用程序:
ClusterIP(默认)
- 在群集中的内部IP上公布服务,这种方式的 Service(服务)只在集群内部可以访问到
NodePort
- 使用 NAT 在集群中每个的同一端口上公布服务
- 这种方式下,可以通过访问集群中任意节点+端口号的方式访问服务 :
- 此时 ClusterIP 的访问方式仍然可用。
LoadBalancer
- 在云环境中(需要云供应商可以支持)创建一个集群外部的负载均衡器,并为使用该负载均衡器的 IP 地址作为服务的访问地址
- 此时 ClusterIP 和 NodePort 的访问方式仍然可用
为 nginx Deployment 创建一个 Service
创建文件 nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service #Service 的名称
labels: #Service 自己的标签
app: nginx #为该 Service 设置 key 为 app,value 为 nginx 的标签
spec: #这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问
selector: #标签选择器
app: nginx #选择包含标签 app:nginx 的 Pod
ports:
- name: nginx-port #端口的名字
protocol: TCP #协议类型 TCP/UDP
port: 80 #集群内的其他容器组可通过 80 端口访问 Service
nodePort: 32600 #通过任意节点的 32600 端口访问 Service
targetPort: 80 #将请求转发到匹配 Pod 的 80 端口
type: NodePort #Serive的类型,ClusterIP/NodePort/LoaderBalancer
部署
apply
kubectl apply -f nginx-service.yaml
检查执行结果
[root@k8s-master01 k8s_yamldate]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
nginx-service NodePort 10.96.10.90 <none> 80:32600/TCP 77s app=nginx
- NAME 是service的name
- TYPE 是NodePort
- CLUSTER-IP 是这个svc的 内部访问ip
- EXTERNAL-IP 是这个svc 的外部访问ip,和公有云对接
- port 代表端口映射
- SELECTOR 代表pod 标签选择器
访问服务
curl <任意节点的 IP>:32600
[root@k8s-master01 k8s_yamldate]# curl localhost:32600
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
Scaling(伸缩)应用程序
- 在之前的文章中,我们创建了一个 Deployment
- 然后通过服务提供访问 Pod 的方式。我们发布的 Deployment 只创建了一个 Pod 来运行我们的应用程序
- 当流量增加时,我们需要对应用程序进行伸缩操作以满足系统性能需求。
将 nginx Deployment 扩容到 4 个副本
修改 nginx-deployment.yaml 文件
- 将 replicas 修改为 4
spec: #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
replicas: 4 #使用该Deployment创建一个应用程序实例
部署
kubectl apply -f nginx-deployment.yaml
[root@k8s-master01 k8s_yamldate]# kubectl get deployment nginx-deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 4/4 4 4 47m
- apply之后可以看到 nginx-deployment中READY 的个数由1变为了4
- 同时观察我们的pod ,可以看到nginx-deployment的pod变成4个
[root@k8s-master01 k8s_yamldate]# kubectl get pod |grep nginx-deployment
nginx-deployment-746fbb99df-tdmb7 1/1 Running 0 48m
nginx-deployment-746fbb99df-v6l9c 1/1 Running 0 102s
nginx-deployment-746fbb99df-v8cm5 1/1 Running 0 102s
nginx-deployment-746fbb99df-w4qqx 1/1 Running 0 102s
[root@k8s-master01 k8s_yamldate]#
执行滚动更新
- 用户期望应用程序始终可用,为此开发者/运维者在更新应用程序时要分多次完成
- 在 Kubernetes 中,这是通过 Rolling Update 滚动更新完成的
- Rolling Update滚动更新 通过使用新版本的 Pod 逐步替代旧版本的 Pod 来实现 Deployment 的更新,从而实现零停机
- 新的 Pod 将在具有可用资源的 Node(节点)上进行调度。
- 这个过程中,Service 能够监视 Pod 的状态,将流量始终转发到可用的 Pod 上。
修改 nginx-deployment.yaml 文件
- 修改文件中 image 镜像的标签,如下所示
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 4
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.8 #使用镜像nginx:1.8替换原来的nginx:1.7.9
ports:
- containerPort: 80
- 执行命令
kubectl apply -f nginx-deployment.yaml
- 查看过程及结果,可以看到 逐步替换的过程
watch kubectl get pods -l app=nginx
Every 2.0s: kubectl get pods -l app=nginx Fri Oct 8 17:14:39 2021
nginx-deployment-746fbb99df-tdmb7 1/1 Terminating 0 52m
nginx-deployment-746fbb99df-v6l9c 0/1 Terminating 0 6m2s
nginx-deployment-746fbb99df-v8cm5 0/1 Terminating 0 6m2s
nginx-deployment-746fbb99df-w4qqx 0/1 Terminating 0 6m2s
nginx-deployment-7cd7fc4dbf-ckdtk 1/1 Running 0 5s
nginx-deployment-7cd7fc4dbf-m4ppb 1/1 Running 0 4s
nginx-deployment-7cd7fc4dbf-pq27j 1/1 Running 0 3s
nginx-deployment-7cd7fc4dbf-xjndw 1/1 Running 0 3s
NAME READY STATUS RESTARTS AGE
nginx-deployment-7cd7fc4dbf-ckdtk 1/1 Running 0 22s
nginx-deployment-7cd7fc4dbf-m4ppb 1/1 Running 0 21s
nginx-deployment-7cd7fc4dbf-pq27j 1/1 Running 0 20s
nginx-deployment-7cd7fc4dbf-xjndw 1/1 Running 0 20s
本节重点总结:
-
k8s Service三种类型
- ClusterIP(默认)
- NodePort
- LoadBalancer
-
为 nginx Deployment 创建一个 Service,并通过service访问pod
-
Scaling(伸缩)应用程序,将 nginx Deployment 扩容到 4 个副本
-
执行滚动更新
- Rolling Update滚动更新 通过使用新版本的 Pod 逐步替代旧版本的 Pod 来实现 Deployment 的更新,从而实现零停机