将docker项目迁入k8s集群
Posted gsls200808
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将docker项目迁入k8s集群相关的知识,希望对你有一定的参考价值。
生成k8syaml文件
docker run转成docker-compose 通过composerize网站:https://www.composerize.com/
docker-compose转k8s的yaml 通过kompose命令 kompose网站:https://kompose.io/
一、安装和转换
安装kompose
curl -L https://github.com/kubernetes/kompose/releases/download/v1.28.0/kompose-linux-amd64 -o kompose
chmod +x kompose
sudo mv ./kompose /usr/local/bin/kompose
转换
kompose convert -f docker-compose.yaml
或者
kompose convert -f docker-compose.yml
转换时,不能有volume路径映射,否则会报错,转换后,每个service会生成一个k8s的service文件和k8s的deployment文件。除此之外还会生成一个网络策略文件。如果没有流量控制功能,可以不适用这个网络策略文件。
如果没有路径映射,到k8s 执行 kubectl apply -f xxx.yaml即可
二、常见迁移需求
正常情况下还会有下面的需求
1.nginx改成NodePort暴露外网访问
默认情况生成的都是ClusterIP类型的service,需要改成NodePort形式
apiVersion: v1
kind: Service
metadata:
annotations:
kompose.cmd: kompose convert -f docker-compose.yml
kompose.version: 1.28.0 (c4137012e)
creationTimestamp: null
labels:
io.kompose.service: fengdian-nginx
name: fengdian-nginx
spec:
ports:
- name: "80"
# 对外暴露的端口
nodePort: 80
port: 80
protocol: TCP
targetPort: 80
selector:
io.kompose.service: fengdian-nginx
# NodePort类型可以对外暴露端口
type: NodePort
status:
loadBalancer:
改的时候不要忘了写protocol: TCP
2.更改nodePort默认端口范围
默认情况下nodePort默认端口为30000-32767,nginx我们一般是80端口访问,我们需要修改
编辑 vi /etc/kubernetes/manifests/kube-apiserver.yaml 配置文件,增加配置 --service-node-port-range=2-65535
apiVersion: v1
kind: Pod
metadata:
annotations:
kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint: 192.168.3.75:6443
creationTimestamp: null
labels:
component: kube-apiserver
tier: control-plane
name: kube-apiserver
namespace: kube-system
spec:
containers:
- command:
- kube-apiserver
# 在这里增加配置即可
- --service-node-port-range=2-65535
- --advertise-address=192.168.3.75
- --allow-privileged=true
- --authorization-mode=Node,RBAC
- --client-ca-file=/etc/kubernetes/pki/ca.crt
- --enable-admission-plugins=NodeRestriction
- --enable-bootstrap-token-auth=true
- --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
- --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
- --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
- --etcd-servers=https://127.0.0.1:2379
- --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt
- --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt
- --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key
- --requestheader-allowed-names=front-proxy-client
- --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
- --requestheader-extra-headers-prefix=X-Remote-Extra-
- --requestheader-group-headers=X-Remote-Group
- --requestheader-username-headers=X-Remote-User
- --secure-port=6443
- --service-account-issuer=https://kubernetes.default.svc.cluster.local
- --service-account-key-file=/etc/kubernetes/pki/sa.pub
- --service-account-signing-key-file=/etc/kubernetes/pki/sa.key
- --service-cluster-ip-range=10.96.0.0/12
- --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
- --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
image: registry.aliyuncs.com/google_containers/kube-apiserver:v1.26.1
使用 docker ps |grep kube-apiserver 命令找到 kube-apiserver 容器,再使用 docker restart 即可生效。
3.持久化卷映射
3.1建议映射文件服务器和数据库服务器的目录
如果觉得前后端容器镜像较大,也可以映射前后端容器镜像。比如war jar包目录 html目录等。
3.2建议给一个容器一个PVC
因为ReadWriteOnce表示只能有一个pod使用,如果我们要给多个POD的话,可以改成ReadWriteMany。但是部分storageClass只支持ReadWriteOnce不支持ReadWriteMany,为了保证兼容性,建议改成一个容器(deployment)对应一个pvc。
3.3单容器多目录映射,使用subPath选项
subPath选项可以指定pvc里的子目录,如下面的tdengine目录映射
volumeMounts:
- name: tdengine-persistent-storage
mountPath: /etc/taos
subPath: etc/taos
- name: tdengine-persistent-storage
mountPath: /var/lib/taos
subPath: lib/taos
- name: tdengine-persistent-storage
mountPath: /var/log/taos
subPath: log/taos
volumes:
- name: tdengine-persistent-storage
persistentVolumeClaim:
claimName: tdengine-pvc
3.4配置文件可以写成ConfigMap文件,也可以做成pvc路径映射
如nginx的ConfigMap yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: fengdian-nginx-config
namespace: default
data:
app.conf: |
server
listen 80;
server_name localhost;
location /fengdian/
# 反向代理到 8080 端口 这个地方fengdian-tomcat在docker中指容器名,在k8s中指服务名
proxy_pass http://fengdian-tomcat:8080;
add_header Access-Control-Allow-Origin *;
location /
root /etc/nginx/html;
index index.html index.htm;
nginxdeployment 引用
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d
volumes:
- name: nginx-config
configMap:
name: fengdian-nginx-config
4.持久化卷初始化数据
如果可访问的本地目录、nfs目录、pvc目录,建议使用kubectl scale命令缩减到0后拷贝目录,复制完文件夹再增加回来。
如初始化数据库目录
#将mysql deployment副本缩减到0
kubectl scale deployment mysql --replicas=0 -n namespace
...
#这里找到pvc目录拷贝初始化的mysql数据文件目录
...
#将mysql deployment副本增加到1
kubectl scale deployment mysql --replicas=1 -n namespace
5.pod间互访问题
docker下内部容器互访建议通过CONTAINER NAME,到了k8s建议通过service name
通过以下命令可以查看k8s所有service name
kubectl get service -A
如果你的docker-compose.yml配置中,service名和container名一致,并且原来的程序就用的container名做程序互访,那么无需改动,转换后的文件可以自动实现互访。
如果不一致,k8s的service yaml中可以修改service name,如下
apiVersion: v1
kind: Service
metadata:
annotations:
kompose.cmd: kompose convert -f docker-compose.yml
kompose.version: 1.28.0 (c4137012e)
creationTimestamp: null
labels:
io.kompose.service: fengdian-nginx
name: fengdian-nginx #修改这里就是修改service name
如果无特殊需求,不建议内部调用使用node ip,service ip pod ip 进行互访(虽然node ip和service ip是固定的),会给程序迁移带来困难。
以上是关于将docker项目迁入k8s集群的主要内容,如果未能解决你的问题,请参考以下文章
5 秒创建 k8s 集群 - 每天5分钟玩转 Docker 容器技术(115)