需求
最新學習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.yaml
和 nginx-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關聯各對象的方式和效果就告一段落,實踐的過程中還有不少坑和知識點的總結,之後還會做分享,希望對大家有所幫助。