天天看點

建立svc來通路deployment部署的pod

  在前面的文章中已經部署好k8s的高可用環境了,這篇文章就在前面文章的基礎上操作了。這裡我們就部署3個Nginx服務的pod,我們是可以通過指令行和編輯yaml檔案來建立的,不過我們一般都會寫一個yaml檔案來建立。

1、YAML基礎

  yaml檔案是專門用來寫配置檔案的語言,非常簡潔和強大,使用的話比json會更友善點,其實實際上是一種通用的資料串行的格式。

yaml檔案的文法規則:

大小寫敏感
使用縮進表示層級關系
縮進不允許使用tab,隻允許空格
縮進的空格數不重要,隻要相同層級的元素左對齊即可
'#'表示注釋,從這個字元一直到行尾,都會被解析器忽略
           

說明:

  • 定義配置時,指定最新穩定版API
  • 配置檔案應該存儲在叢集之外的版本控制倉庫中。如果需要,可以快速復原配置、重新建立和恢複
  • 應該使用YAML格式編寫配置檔案,而不是json。YAML對使用者更加友好
  • 可以将相關對象組合成單個檔案,通常會更容易管理
  • 不要沒必要指定預設值,簡單和最小配置減小錯誤
  • 在注釋中說明一個對象描述更好維護

2、建立YAML檔案

2.1、YAML檔案内容

  這裡我就現在建立一個單獨的namespace,編輯一個yaml檔案建立Deployment和Service,這兩個也是可以單獨執行,放在一個yaml檔案中的話是需要使用連續的三個短橫線隔開,内容如下:

root@k8s-master1:/data/k8s-yaml# vim zg-test-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: zg-test
root@k8s-master1:/data/k8s-yaml# vim nginx-test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: zg-test
  name: nginx-test-deoloyment
  labels:
    app: nginx-test
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-test
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      containers:
      - name: nginx-test
        image: nginx:1.18.0
        ports:
        - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: test-nginx-service-label
  name: test-nginx-service
  namespace: zg-test
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30004
  selector:
    app: nginx-test
           

2.2、YAML檔案的簡要說明

2.2.1、Deployment

  在一個完整的Deployment中是需要包含matedata(中繼資料)、spec(期望狀态)和status(狀态)三部分,status是需要建立Deployment完後才會顯示的,會有running的狀态,也會有其他的異常狀态。

apiVersion:指的是建立對象所使用的API版本,此值必須在kubectl apiversion中。
kind:需指定副本控制器,副本控制器發展到目前共有三代,依次為Replication Controller、ReplicaSet和Deployment。

metadata: Deployment的中繼資料,幫助識别對象唯一性的資料,包含名稱和标簽,也可以加上名稱空間等資訊。

1、namespace:指定名稱空間

2、name:指定版本控制器名稱

3、labels:定義資源的标簽

spec:相當于Deployment的規範,是Deployment建立pod的期待狀态,用于定義Deployment中容器的詳細資訊。

1、replicas:副本數量,即建立幾個pod,建立多個pod時,極大機率會分布在不同的node節點上,很少出現偏向同一節點的情況;

2、selector:定義标簽選擇器,通過比對label來告訴控制器去管理哪些副本,使pod維持在期望狀态;

① matchLabels:定義比對的标簽,必須要設定;

② app: nginx:比對的目标标簽;

3、template:模闆,必須要設定,用于定義期望狀态下的pod相關資訊。

① metadata:定義模闆中繼資料;

② labels:定義模闆标簽;

③ app: 模闆标簽名稱;

④ spec:定義pod相關資訊;

⑥ containers:定義pod中的容器數量,可以為1個或者多個,pod不能動态增減容器數量;

⑦ - name:容器名稱;

⑧ image:容器使用的鏡像;

⑨ ports:容器端口清單;

⑩ - containerPort:pod容器使用的端口。

2.2.2、SVC

  格式基本上差不多,不過在SVC中可以看對應的labels來做比對。

apiVersion:指定需要使用的API版本,是需要此值必須在kubectl apiversion中。
kind:選擇建立資源的角色/類型。

matedata:定義資源的中繼資料/屬性;

1、lables:定義資源的标簽;

2、name:定義service的名稱,該名稱可以被DNS解析;

3、namespace:定義service的指令空間。

spec:定義容器中的詳細資訊

1、type:定義服務的通路方式,預設是ClusterIP,這樣的話就隻能在k8s叢集内部通路;

2、ports:定義通路端口清單;

① - name:定義端口的端口的名稱;

② port:定義service監聽的端口;

③ protocol:service服務進行轉發時使用的協定,這裡是支援tcp、udp和stcp三種協定的;

④ targetPort:設定目标容器的端口;

⑤ nodePort:在主控端上打開的端口号,如果type使用的ClusterIP,就可以不需要添加此配置。

selector:這個是service的效驗器或标簽選擇器,這個是要比對通路到目标的pod,這裡的值是需要和Deployment.spec.selector.mathLabels的值相對應的。

3、使用YAML檔案建立namespace、Deployment和SVC

  編輯好的yaml檔案是需要使用kubectl apply指令來建立的,這裡的鏡像我就使用官方的nginx鏡像了,在生産環境的話都是打好自己的鏡像來建立容器的,建立完後等一會就可以看deployment的狀态了,沒出問題的話就會三個pod的狀态都是ready的,可以檢視pod資訊時,會發現通過deployment建立的三個nginx pod已經正常運作了。

建立svc來通路deployment部署的pod

4、修改nginx的預設頁面并通路測試

5、高可用代理配置

root@ha1:~# vim /etc/haproxy/haproxy.cfg 	#在配置檔案最後加上下面内容,配置完後再重新開機一下haproxy服務
listen kubernetes-nginx-80
    bind 10.0.0.200:80
    mode tcp
    balance roundrobin
    server node1 10.0.0.106:30004 check inter 3s fall 3 rise 5 
    server node2 10.0.0.107:30004 check inter 3s fall 3 rise 5 
    server node3 10.0.0.108:30004 check inter 3s fall 3 rise 5
root@ha1:~# systemctl restart haproxy.service
           

繼續閱讀