k8s用自己话说,就是一种容器编排工具,部署好应用,再创建绑定应用的服务,就可以实现的服务访问了。这个理论还是得去看重点谈理论的文章,此处我们只记录本项目部署过程。
背景介绍
之前已实现gitlab-ci自动集成代码,部署到tomcat容器,并推送到阿里云镜像仓库。
此项目使用阿里云的k8s容器服务部署应用。
一系列准备工作,先参考阿里云文档
快速创建Kubernetes集群
https://help.aliyun.com/document_detail/85903.html?spm=a2c4g.11186623.6.555.534c4b4bY7F07R
SSH访问Kubernetes集群
https://help.aliyun.com/document_detail/86491.html?spm=5176.11065259.1996646101.searchclickresult.37524c20dma8gQ
通过以上SSH访问Kubernetes集群的负载均衡地址登录到集群master,进行以下操作
创建secret
为了代码安全,我们将镜像仓库设为私有,私有仓库就需要对k8s的授权,在k8s master建secret
kubectl create secret docker-registry test-secret --docker-server=registry-vpc.cn-shanghai.aliyuncs.com/testimage/test --docker-username=uraliyun_name --docker-password=repo_passwd --docker-email=mail@mail.com
创建挂载卷
由于我项目的特殊需求,在镜像里除了war包外还有一个外部配置文件,我需要将外部配置文件挂载到pod的指定目录下
现将配置文件传到本服务器中,此处先将配置文件做成configmap,在文件所在路径下执行
kubectl create configmap test.properties --from-file test.properties
以yaml文件的形式创建deploy
创建yaml文件
vim test.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: test-backend-tomcat
labels:
app: testbackend
spec:
replicas: 1 #副本集,定义pod数
selector:
matchLabels:
app: testbackend
template:
metadata:
labels: #标签,pod svc等资源是以标签关联,所以不同应用要打上不同标签
app: testbackend
spec:
imagePullSecrets: #创建的secret
- name: test-backend-secret
containers:
- name: test-backend-tomcat
image: registry-vpc.cn-shanghai.aliyuncs.com/testimage/test-backend:1 #镜像
resources: #资源限制,最大值与请求值
limits:
cpu: "0.5"
memory: 100Mi
requests:
cpu: "0.2"
memory: 50Mi
ports:
- containerPort: 8080
volumeMounts: #挂载卷
- name: test-backend-volume
mountPath: /rogueone/testconfig/
- name: test-backend-log-volume #将worker节点上/logs/test-backend做成一个名为test-backend-log-volume的存储卷,再将该存储卷挂载在pod的容器里的/logs下
mountPath: /logs
volumes:
- name: test-backend-volume
configMap:
name: test.properties
- name: test-backend-log-volume
hostPath: #卷的类型是hostpath,即worker节点目录挂载到容器类型的卷
path: /logs/test-backend
type: Directory
以yaml文件生成相关资源,并查看
kubectl create -f appstore.yaml
kubectl get deployment|grep test-backend-tomcat
创建关联以上deploy的nodeport 类型的svc
创建yaml文件
vim test_svc.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
ports:
- port: 30080 #服务端口,供集群内部访问使用
targetPort: 8080 # 容器端口,容器中提供服务的端口
nodePort: 30001 #节点端口,在节点上对外开放的端口
selector:
app: testbackend #此处标签要与deploy中matchlabel一致
根据以上yaml文件创建对应的服务,并查看
kubectl create -f test_svc.yaml
kubectl get svc |grep nginx-service
此时在k8s的master与worker上都开放了对应的节点端口可以访问到容器服务
通过阿里云负载均衡访问到k8s
创建一个负载均衡,通过不同端口区别不同服务,同一个端口负载到k8s三台master对应的节点端口。