【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
done.
祝玩的開心~