需求
最新学习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关联各对象的方式和效果就告一段落,实践的过程中还有不少坑和知识点的总结,之后还会做分享,希望对大家有所帮助。