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

发布了62 篇原创文章 · 获赞 33 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/yyoc97/article/details/102512711