名詞解釋
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
done.
祝玩的開心~