【k8s】使用k8s部署一個簡單的nginx服務

Mr.YF發表於2021-10-08

名詞解釋

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.

祝玩的開心~

相關文章