将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集群的主要内容,如果未能解决你的问题,请参考以下文章

解决k8s集群中Redis Cluster故障

5 秒创建 k8s 集群 - 每天5分钟玩转 Docker 容器技术(115)

Docker发布第一个GitHub Action项目 / Google推出K8s游戏集群服务

k8s和docker区别

真快!10秒内将k8s集群运行起来

docker和k8s的关系