【k8s】使用k8s部署一个简单的nginx服务
名词解释
Namespace 表示命名空间
Deployment 表示pod发布
Service 表示多个pod做为一组的集合对外通过服务的表示
kubectl 是k8s的命令行操作命令,可以创建和更新,删除,列表和查详情等一系列的操作
部署步骤
同样的方法将deployment改成service,可以实现对service的增删该查等操作。
一、创建命名空间namespace
1. 创建命名空间的yaml文件 nginx-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: nginx
labels:
name: nginx
配置说明:
kind:Namespace 表示yaml文件创建的是命名空间
metadata表示命名空间的元信息
metadata.name 是命名空间的名称 取值nginx
metadata.labels 是命名空间的标签 name=nginx
2. 创建命名空间nginx
kubectl create -f nginx-namespace.yaml
3. 查询命名空间
# 查询所有命名空间,可以看到新创建的命名空间nginx ➜ kube kubectl get namespaces NAME STATUS AGE default Active 85d kube-node-lease Active 85d kube-public Active 85d kube-system Active 85d nginx Active 8d
4. 查询命名空间nginx详情
➜ kube kubectl describe namespace nginx Name: nginx Labels: name=nginx Annotations: <none> Status: Active
总结:
从命名空间详情中可以看到如下信息
命名空间名称: nginx
命名空间的标签:name=nginx
命名空间状态:Active 表示命名空间活跃
二、创建nginx的发布Deployment
1. 创建deployment的yaml文件 nginx-deployment.yaml
➜ kube cat nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx-deployment1 namespace: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx:1.14.0 ports: - containerPort: 80 name: nginx volumeMounts: - name: conf mountPath: /etc/nginx/nginx.conf - name: log mountPath: /var/log/nginx - name: html mountPath: /etc/nginx/html tolerations: - key: "key" operator: "Equal" value: "nginx" effect: "NoSchedule" volumes: - name: conf hostPath: path: /Users/w/kube/nginx/conf/nginx.conf - name: log hostPath: path: /Users/w/kube/nginx/logs type: Directory - name: html hostPath: path: /Users/w/kube/nginx/html type: Directory
配置说明:
kind: Deployment表示yaml文件创建的是一个Deployment发布
metadata表示这个deployment的元信息
metadata.name 是deployment的名称 nginx-deployment1
metadata.labels 是deployment的标签 即:app=nginx
metadata.namespace 是deployment的命名空间,此处选择的是第一步创建的命名空间nginx
spec: 表示deployment的详细参数配置说明
spec.replicas 是启动几个pod节点
spec.template.spec 是deployment选择模块的详细说明
spec.template.spec.containers 表示选择的容器是什么,此处是nginx的docker镜像 nginx:1.14.0,容器的端口设置 containerPort: 80, volumeMounts表示绑定的文件和目录
spec.template.spec.volumes 表示选择的容器挂载的宿主机的文件和目录 conf, log和html
2. 创建deployment的nginx
kubectl create -f nginx-deployment.yaml
3. 查询nginx命名空间下的pods
# ➜ kube kubectl get pods -n nginx NAME READY STATUS RESTARTS AGE nginx-deployment1-6cb86fb6b7-kkpbw 1/1 Running 5 7d20h
可以看到有一个nginx-deployment的pods, 启动了1个pods运行Running状态
可以通过修改如上yaml文件的spec.replicas启动多个pods,
增加pods节点从1个到3个如下
spec.replicas: 3
# ➜ kube kubectl get pods -n nginx NAME READY STATUS RESTARTS AGE nginx-deployment1-6cb86fb6b7-kkpbw 1/1 Running 5 7d20h nginx-deployment1-6cb86fb6b7-txkkj 0/1 ContainerCreating 0 1s nginx-deployment1-6cb86fb6b7-ztt2t 0/1 ContainerCreating 0 1s
如上可以看到有两个新的pod处于容器创建中状态,容器创建成功后,状态会转移到Running,READY也会变成1/1
减少pods节点从3个到1个如下
# ➜ kube kubectl apply -f nginx-deployment.yaml deployment.apps/nginx-deployment1 configured # ➜ kube kubectl get pods -n nginx NAME READY STATUS RESTARTS AGE nginx-deployment1-6cb86fb6b7-d6z6l 1/1 Terminating 0 98s nginx-deployment1-6cb86fb6b7-kkpbw 1/1 Running 5 7d20h nginx-deployment1-6cb86fb6b7-qtx2v 1/1 Terminating 0 98s
如上所示,有两个pod状态是终止中,只剩余一个处于Running状态
4. 查询命名空间nginx下的发布deployment
# ➜ kube kubectl describe deployment nginx -n nginx Name: nginx-deployment1 Namespace: nginx CreationTimestamp: Thu, 30 Sep 2021 11:46:53 +0800 Labels: app=nginx Annotations: deployment.kubernetes.io/revision: 1 Selector: app=nginx Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable # ...
可以看到pods节点是1个。
5. 查询命名空间nginx下的发布pod详情
# ➜ kube kubectl describe pod nginx-deployment1-6cb86fb6b7-kkpbw -n nginx Name: nginx-deployment1-6cb86fb6b7-kkpbw Namespace: nginx Priority: 0 Node: docker-desktop/192.168.65.4 Start Time: Thu, 30 Sep 2021 15:12:48 +0800 Labels: app=nginx pod-template-hash=6cb86fb6b7 Annotations: <none> Status: Running IP: 10.1.0.170 # ...
6. 删除一个deployment的pod节点
# ➜ kube kubectl delete pod nginx-deployment1-6cb86fb6b7-txkkj -n nginx pod "nginx-deployment1-6cb86fb6b7-txkkj" deleted
三、创建nginx的服务Service
1. 创建service的yaml文件 nginx-service.yaml
# ➜ kube cat nginx-service.yaml apiVersion: v1 kind: Service metadata: labels: app: nginx name: nginx-deployment1 namespace: nginx spec: ports: - port: 9000 name: nginx-service80 protocol: TCP targetPort: 80 nodePort: 31090 selector: app: nginx type: NodePort
配置说明:
kind: Service表示yaml文件创建的是一个Service
metadata表示这个Service的元信息
metadata.name 是Service的名称 nginx-deployment1
metadata.labels 是Service的标签 即:app=nginx
metadata.namespace 是Service的命名空间,此处选择的是第一步创建的命名空间nginx
sepc是Service的详细配置说明
sepc.type 取值NodePort 表示这个Service的类型是一个节点端口转发类型
sepc.selector 表示这个Service是将带标签的哪些pods做为一个集合对外通过服务
sepc.ports.port 是Service绑定的端口
sepc.ports.name: nginx-service80 表示Service服务的名称
sepc.ports.protocol: TCP 表示Service转发请求到容器的协议是TCP,我们部署的http的nginx服务,因此选择协议为TCP
sepc.ports.targetPort: 80 表示Service转发外部请求到容器的目标端口80,即deployment的pod容器对外开放的容器端口80
sepc.ports.nodePort: 31090 表示Service对外开放的节点端口
2. 创建一个服务
# ➜ kube kubectl create -f nginx-service.yaml
service/nginx-deployment1 created
即可以使用浏览器打开这个端口的页面,如下
4. 查询服务列表
# ➜ kube kubectl get services -n nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-deployment1 NodePort 10.96.92.3 <none> 9000:31090/TCP 34s
5. 查询服务详情
# ➜ kube kubectl describe service nginx-deployment1 -n nginx Name: nginx-deployment1 Namespace: nginx Labels: app=nginx Annotations: <none> Selector: app=nginx Type: NodePort IP: 10.96.92.3 LoadBalancer Ingress: localhost Port: nginx-service80 9000/TCP TargetPort: 80/TCP NodePort: nginx-service80 31090/TCP Endpoints: 10.1.0.170:80,10.1.0.176:80,10.1.0.178:80 Session Affinity: None External Traffic Policy: Cluster Events: <none>
6. 删除一个service服务
# ➜ kube kubectl delete services nginx-deployment1 -n nginx service "nginx-deployment1" deleted
如上就是通过k8s简单部署一个nginx服务的步骤
其中包括如下步骤
- 命名空间的创建
- 标签的增加
- deployment的pods发布,增加和减少pods的方法
- 节点端口转发的Service创建
- 删除一个服务
- 删除一个pod
四、 其他命令
4.1 发布镜像
kubectl set image pod deployment/nginx-deployment nginx-deployment =xxx.domain.com/image-test-env/nginx-deployment -n nginx
4.2 重启 pod
kubectl rollout restart deployment nginx-deployment -n nginx
done.
祝玩的开心~