Kubernetes實踐——集羣根據label構建多環境應用

需求

最新學習Kubernetes採坑不少,這裏先用一個實際架構來分享下k8s的使用吧。我們通過k8s來編排一個多種環境的集羣。要求集羣提供不同環境services服務訪問,如下圖所示,暴露兩個service,通過label區分,分別對應有不同pods提供服務,根據release = stable和release=rc-1來對應,而pods上根據指定nodesSelector來區分不同環境的宿主節點(當然nodes也是能用selector的方式指定)。接下來我們就來實現下類似架構。
在這裏插入圖片描述

環境

首先準備好一個可用的k8s集羣,由於是測試環境,目前nodes我只提供了兩個節點(master端口默認是8080,個人配置爲8088)

[root@dc-sit-226 ~]# kubectl -s dc-sit-226:8088 get nodes
NAME         STATUS    AGE
dc-sit-226   Ready     73d
sit-01       Ready     73d

由於測試中需要訪問url來測試http請求,所以這裏我準備了一個nginx:alpine的鏡像。相對latest版本的nginx來說,alpine要小很多,只有20M。大家可以提前拉取。

[root@dc-sit-226 kube]# docker images
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
docker.io/nginx                                       alpine              4d3c246dfef2        2 weeks ago         21.2 MB
docker.io/nginx                                       latest              f949e7d76d63        2 weeks ago         126 MB

實踐

配置節點標籤

接下來我們給節點打上name爲env的label,dc-sit-226 標籤爲test境,給sit-01爲dev。

kubectl -s dc-sit-226:8088 label nodes sit-01 env=dev
kubectl -s dc-sit-226:8088 label nodes dc-sit-226 env=test

#查看打好標籤
kubectl -s dc-sit-226:8088 get nodes --show-labels
NAME         STATUS    AGE       LABELS
dc-sit-226   Ready     73d       beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,env=test,kubernetes.io/hostname=dc-sit-226
sit-01       Ready     73d       beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,env=dev,kubernetes.io/hostname=sit-01

如果要對標籤進行修改

刪除標籤
kubectl label nodes <node-name> <label-key>-
修改Label的值,語法: 需要加上--overwrite參數
kubectl label nodes <node-name> <label-key>=<label-value> --overwrite

配置deployment

目前官方不推薦我們直接構建pod,而是通過deploy形式,deployment包含了Replication Controller(RC)和replicas set的功能,能夠自動控制管理pod實例。所以我們配置分別配置nginx-dev-deploy.yamlnginx-test-deploy.yaml

### nginx-dev-deploy.yaml配置

apiVersion: extensions/v1beta1
kind: Deployment	#類型設置
metadata:
  labels:	#deploy標籤
    env: dev
  name: my-nginx	#應用名稱,可以取dev-nginx,這個是之前隨意取得
  namespace: default
spec:
  replicas: 2	#pod副本數,dev環境我們這裏設置2個
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:	#pod配置
    metadata: 
      labels:	#pod標籤
        env: dev
    spec:
      nodeSelector:	#節點選擇,我們制定標籤env=dev的,這裏也能制定域名或者ip
        env: dev
      containers:
      - image: nginx:alpine
        name: nginx-app
        ports:
        - containerPort: 80
          protocol: TCP
      dnsPolicy: ClusterFirst
      restartPolicy: Always
### nginx-test-deploy.yaml 和上面大同小異,我們把標籤相應修改爲test,副本數改爲3

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    env: test
  name: nginx-test
  namespace: default
spec:
  replicas: 3
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      labels:
        env: test
    spec:
      nodeSelector:
        env: test
      containers:
      - image: nginx:alpine
        name: nginx-app
        ports:
        - containerPort: 80
          protocol: TCP
      dnsPolicy: ClusterFirst
      restartPolicy: Always

配置完成後我們一起進行部署。

 kubectl -s dc-sit-226:8088 create -f nginx-dev-deploy.yaml 
 kubectl -s dc-sit-226:8088 create -f nginx-test-deploy.yaml 

# 查看部署,可以看到每個deploy下的副本個數。
[root@dc-sit-226 kube]#  kubectl -s dc-sit-226:8088 get deploy
NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
my-nginx       2         2         2            2           23h
nginx-test     3         3         3            3           23h

# 確認pod運行狀態,添加-o參數,可以查看ip以及運行在哪個node上,
kubectl -s dc-sit-226:8088 get pods -o wide
NAME                            READY     STATUS    RESTARTS   AGE       IP           NODE
my-nginx-3285237054-16vg0       1/1       Running   0          23h       10.10.21.5   sit-01
my-nginx-3285237054-f2pk9       1/1       Running   0          23h       10.10.21.4   sit-01
nginx-test-1388035648-0b9wr     1/1       Running   0          23h       10.10.81.7   dc-sit-226
nginx-test-1388035648-21j07     1/1       Running   0          23h       10.10.81.6   dc-sit-226
nginx-test-1388035648-99d9x     1/1       Running   0          23h       10.10.81.5   dc-sit-226
...
nginx-app-2007220645-748x1      1/1       Running   0          3d        10.10.81.3   dc-sit-226
nginx-app-2007220645-vs2pn      1/1       Running   0          3d        10.10.21.2   sit-01

可以看到幾個pod都是正常運行的,如果有異常也可以通過describe對deploy和pods進行查看。由於我們指定了nodeSelector,所以pod都分別運行在對應機器上,而我之前部署的應用nginx-app,沒有指定nodeSelector,所以分佈在各個節點。

配置service

部署完pod後,我們需要暴露對應的端口提供給外部訪問,這時我們需要配置不同環境的service。

### nginx-test-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: nginx-test-svc
  namespace: default
  labels:
    env : test
spec:
  selector:	#選擇對應的標籤
    env : test
  ports:
  - port: 80
    targetPort: 80
    nodePort: 31000	#暴露對外的端口
  type: NodePort	#通過端口的形式,常用的還有ClusterIP
### nginx-dev-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: nginx-dev-svc
  namespace: default
  labels:
    env : dev
spec:
  selector:	#選擇對應的標籤
    env : dev
  ports:
  - port: 80
    targetPort: 80
    nodePort: 31001	
  type: NodePort

完成後同樣創建服務:

kubectl -s dc-sit-226:8088 create -f nginx-test-svc.yaml 
kubectl -s dc-sit-226:8088 create -f nginx-dev-svc.yaml 

# 查看部署的services
kubectl -s dc-sit-226:8088 get svc
NAME             CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx-test-svc   10.10.55.242    <nodes>       80:31000/TCP   1d
nginx-dev-svc   10.10.55.243    <nodes>       80:31001/TCP   1d

驗證

因爲我們指定了dc-sit-226節點部署的nginx-test,所以可以直接訪問http://dc-sit-226:31000/,同理dev環境就是:http://sit-01:31001
在這裏插入圖片描述
如果要校驗服務映射的pods,可以通過kubectl logs 命令實時查看5個pods的訪問日誌。

結尾

到此我們就通過k8s管理構建出一個多環境的架構了,利用selector label關聯各對象的方式和效果就告一段落,實踐的過程中還有不少坑和知識點的總結,之後還會做分享,希望對大家有所幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章