生活札记

Docker+K8S+Devops零基础入门教程之K8S

copylian    1 评论    10541 浏览    2023.02.15

Kubernetes也称为 K8s,是用于自动部署扩缩管理容器化应用程序的开源系统。它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。Kubernetes 源自Google 15 年生产环境的运维经验,同时凝聚了社区的最佳创意和实践。

官网:https://kubernetes.io/zh-cn/  

视频教程:https://www.bilibili.com/video/BV1yP4y1x7Vj

视频教程(推荐)https://www.bilibili.com/video/BV1Tg411P7EB/ 、文档:https://k8s.easydoc.net/

文本教程:https://blog.csdn.net/cxyxt/article/details/127922374

文本教程:https://blog.csdn.net/qq_31233097/article/details/123913695

微信图片_20230210110600.png

Kubernetes(K8S)简介

1)、Kubernetes 集群架构:

master

主节点,控制平台,不需要很高性能,不跑任务,通常一个就行了,也可以开多个主节点来提高集群可用度。

worker

工作节点,可以是虚拟机或物理计算机,任务都在这里跑,机器性能需要好点;通常都有很多个,可以不断加机器扩大集群;每个工作节点由主节点管理



kwob90mh.png


微信图片_20230210142104.png

重要概念 Pod

豆荚,K8S 调度、管理的最小单位,一个 Pod 可以包含一个或多个容器,每个 Pod 有自己的虚拟IP。一个工作节点可以有多个 pod,主节点会考量负载自动调度 pod 到哪个节点运行。

微信图片_20230213092953.png

Kubernetes 组件 :

kube-apiserver API 服务器,公开了 Kubernetes API

etcd 键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库

kube-scheduler 调度 Pod 到哪个节点运行

kube-controller 集群控制器

cloud-controller 与云服务商交互

微信图片_20230210142416.png

kwonmx7e.png

2)、安装 Kubernetes 集群

1)、云平台搭建

        腾讯云 TKE(控制台搜索容器)登录

        阿里云控制台 - 产品搜索 Kubernetes


2)、裸机搭建(Bare Metal)

主节点需要组件

        docker(也可以是其他容器运行时)

        kubectl 集群命令行交互工具

        kubeadm 集群初始化工具


工作节点需要组件 文档

        docker(也可以是其他容器运行时)

        kubelet 管理 Pod 和容器,确保他们健康稳定运行

        kube-proxy 网络代理,负责网络相关的工作


设置网卡:如果是虚拟机需要设置网卡(不自动分配)、设置自动启动

        vim /etc/sysconfig/network-scripts/ifcfg-ens33

微信图片_20230316170013.png

重启网卡:systemctl restart network


开始安装:建议买x86_64的机器,之前买ARM的机器导致镜像问题

        # 每个节点分别设置对应主机名

        hostnamectl set-hostname master

        hostnamectl set-hostname node1

        hostnamectl set-hostname node2


        # 所有节点都修改 hosts

        vim /etc/hosts

        172.16.0.15 master

        172.16.0.8 node1

        172.16.0.12 node2


        # 所有节点关闭 SELinux

        setenforce 0

        sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux


        关闭swap:

        swapoff -a

        vim /etc/fstab

        注释行:#/dev/mapper/centos-swap swap                    swap    defaults        0 0

        重启:reboot now


        #所有节点确保防火墙关闭

        systemctl stop firewalld

        systemctl disable firewalld


        添加安装源(所有节点)

        添加 k8s 安装源

        cat <<EOF > /etc/yum.repos.d/kubernetes.repo

        [kubernetes]

        name=Kubernetes

        baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64

         enabled=1

        gpgcheck=0

        repo_gpgcheck=0

        gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

     EOF


        # 添加 Docker 安装源

        yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    

        安装所需组件(所有节点)

        yum install -y kubelet-1.22.4 kubectl-1.22.4 kubeadm-1.22.4 docker-ce

        直接运行:yum install -y kubelet kubectl kubeadm docker-ce 会存在版本依赖问题,docker版本如果是23.0.1,kubeadm 会校验失败,不过通过:kubeadm config images pull、kubeadm reset就可以处理报错了


        启动 kubelet、docker,并设置开机启动(所有节点)

        systemctl enable kubelet

        systemctl start kubelet

        systemctl enable docker

        systemctl start docker


        修改 docker 配置(所有节点)

        # kubernetes 官方推荐 docker 等使用 systemd 作为 cgroupdriver,否则 kubelet 启动不了

        cat <<EOF > /etc/docker/daemon.json

        {

                "exec-opts": ["native.cgroupdriver=systemd"],

                "registry-mirrors": ["https://ud6340vz.mirror.aliyuncs.com"]

         }

        EOF


        # 重启生效

        systemctl daemon-reload

        systemctl restart docker


        用 kubeadm 初始化集群(仅在主节点跑

        # 初始化集群控制台 Control plane

        # 失败了可以用 kubeadm reset 重置

        kubeadm init --image-repository=registry.aliyuncs.com/google_containers

        

        # 记得把 kubeadm join xxx 保存起来(子节点跑

        # 忘记了重新获取:kubeadm token create --print-join-command

        

        # 复制授权文件,以便 kubectl 可以有权限访问集群(主节点

        # 如果你其他节点需要访问集群,需要从主节点复制这个文件过去其他节点

        mkdir -p $HOME/.kube

        cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

        chown $(id -u):$(id -g) $HOME/.kube/config

    

        把工作节点加入集群(只在工作节点跑

         kubeadm join 172.16.32.10:6443 --token xxx --discovery-token-ca-cert-hash xxx

        kubeadm join 172.16.0.15:6443 --token dpz4pp.do43er17sakvoi33 --discovery-token-ca-cert-hash sha256:433167500093adcfac1a33485c8b75ebb2d9e61ce64e2871f6cd77a425607ea3

        

        安装网络插件,否则 node 是 NotReady 状态(主节点跑)

        # 很有可能国内网络访问不到这个资源,你可以网上找找国内的源安装 flannel

        kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

        

         # 如果上面的插件安装失败,可以选用 Weave,下面的命令二选一就可以了。

         kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml

         kubectl apply -f http://static.corecore.cn/weave.v2.8.1.yaml

        

        更多其他网路插件查看下面介绍,自行网上找 yaml 安装:https://blog.csdn.net/ChaITSimpleLove/article/details/117809007

        请注意,flannel 插件很多学员都安装不上(因为网络问题),这样会导致后面名字访问服务用不了,大家可以改用 weave 或者使用香港服务器或者寻找国内的源安装

        查看节点,要在主节点查看(其他节点有安装 kubectl 也可以查看)

kw8x2qdf.png

        Pod 报错解决:如果pod一直是ContainerCreating状态或者报错可配置:

                如果你运行 kubectl describe pod/pod-name 发现 Events 中有下面这个错误

                networkPlugin cni failed to set up pod "test-k8s-68bb74d654-mc6b9_default" network: open /run/flannel/subnet.env: no such file or directory

                在每个节点创建文件/run/flannel/subnet.env写入以下内容,配置后等待一会就好了

                FLANNEL_NETWORK=10.244.0.0/16

                FLANNEL_SUBNET=10.244.0.1/24

                FLANNEL_MTU=1450

                FLANNEL_IPMASQ=true


        应用一直 Terminating 的问题:https://blog.csdn.net/qq_26545503/article/details/123212493

        systemctl status kubelet

        vim /etc/cni/net.d/10-flannel.conflist

                {

                  "cniVersion": "0.3.1",

                  "name": "cbr0",

                  "plugins": [

                    {

                      "type": "flannel",

                      "delegate": {

                        "hairpinMode": true,

                        "isDefaultGateway": true

                      }

                    },

                    {

                      "type": "portmap",

                      "capabilities": {

                        "portMappings": true

                      }

                    }

                  ]

                }


3)、部署应用到集群中

直接命令运行

kubectl run testapp --image=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1


Pod.yaml文件:kubectl apply -f pod.yaml

apiVersion: v1

kind: Pod

metadata:

    name: test-pod

spec:

    # 定义容器,可以多个

    containers:

        - name: test-k8s # 容器名字

          image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 镜像


Deployment.yaml:kubectl apply -f deployment.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

    # 部署名字

    name: test-k8s

spec:

    replicas: 2

    # 用来查找关联的 Pod,所有标签都匹配才行

    selector:

        matchLabels:

            app: test-k8s

    # 定义 Pod 相关数据

    template:

        metadata:

            labels:

                app: test-k8s

        spec:

            # 定义容器,可以多个

            containers:

                - name: test-k8s # 容器名字

                  image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 镜像


Deployment 通过 label 关联起来 Pods

kwpt8p8o.png

工作负载分类

Deployment:适合无状态应用,所有pod等价,可替代

StatefulSet:有状态的应用,适合数据库这种类型。

DaemonSet:在每个节点上跑一个 Pod,可以用来做节点监控、节点日志收集等

Job & CronJob:Job 用来表达的是一次性的任务,而 CronJob 会根据其时间规划反复运行。


操作命令

# 部署应用

kubectl apply -f app.yaml

# 查看 deployment

kubectl get deployment

# 查看 pod

kubectl get pod -o wide

# 查看 pod 详情

kubectl describe pod pod-name

# 查看 log

kubectl logs pod-name

# 进入 Pod 容器终端, -c container-name 可以指定进入哪个容器。

kubectl exec -it pod-name -- bash

# 伸缩扩展副本

kubectl scale deployment test-k8s --replicas=5

# 把集群内端口映射到节点

kubectl port-forward pod-name 8090:8080

# 查看全部

kubectl get all

# 删除部署

kubectl delete deployment test-k8s

# 输出到文件

kubectl get deployment test-k8s -o yaml >> app2.yaml

# 删除全部资源

kubectl delete all --all

# 命令修改镜像,--record 表示把这个命令记录到操作历史中

kubectl set image deployment test-k8s test-k8s=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v2-with-error --record

# 查看历史

kubectl rollout history deployment test-k8s

# 回到上个版本

kubectl rollout undo deployment test-k8s

# 回到指定版本

kubectl rollout undo deployment test-k8s --to-revision=2

# 重新部署

kubectl rollout restart deployment test-k8s

# 暂停运行,暂停后,对 deployment 的修改不会立刻生效,恢复后才应用设置

kubectl rollout pause deployment test-k8s

# 恢复

kubectl rollout resume deployment test-k8s


4)、Service

Service 通过 label 关联对应的 Pod

Servcie 生命周期不跟 Pod 绑定,不会因为 Pod 重创改变 IP

提供了负载均衡功能,自动转发流量到不同 Pod

可对集群外部提供访问端口

集群内部可通过服务名字访问:curl tomcat-deployment:8080

kwpuoh0h.png

创建 Service

创建 一个 Service,通过标签test-k8s跟对应的 Pod 关联上


service.yaml

apiVersion: v1

kind: Service

metadata:

    name: test-k8s

spec:

    selector:

        app: test-k8s

    type: ClusterIP

    #type: NodePort

    ports:

        - port: 8080        # 本 Service 的端口

        targetPort: 8080  # 容器端口

        #nodePort: 31000 # 节点端口,范围 30000 ~ 32767


应用配置 kubectl apply -f service.yaml


查看服务 kubectl get svc

kwvie6pw.png

查看服务详情 kubectl describe svc test-k8s,可以发现 Endpoints 是各个 Pod 的 IP,也就是他会把流量转发到这些节点。

kwvifqes.png

服务的默认类型是ClusterIP,只能在集群内部访问,我们可以进入到 Pod 里面访问:

kubectl exec -it pod-name -- bash

curl http://10.100.79.253:8080

如果要在集群外部访问,可以通过端口转发实现(只适合临时测试用):--address能保证浏览器访问

kubectl port-forward service/test-k8s 8080:8080 --address 0.0.0.0


对外暴露服务

上面我们是通过端口转发的方式可以在外面访问到集群里的服务,如果想要直接把集群服务暴露出来,我们可以使用NodePort 和 Loadbalancer 类型的 Service


service.yaml

apiVersion: v1

kind: Service

metadata:

    name: test-k8s

spec:

    selector:

        app: test-k8s

    #type: ClusterIP

    type: NodePort

    ports:

        - port: 8080        # 本 Service 的端口

        targetPort: 8080  # 容器端口

        nodePort: 31000 # 节点端口,范围 30000 ~ 32767

应用配置 kubectl apply -f service.yaml

在节点上,我们可以 curl http://localhost:31000/hello/easydoc 访问到应用

并且是有负载均衡的,网页的信息可以看到被转发到了不同的 Pod

ClusterIP:默认的,仅在集群内可用

NodePort:暴露端口到节点,提供了集群外部访问的入口,端口范围固定 30000 ~ 32767

LoadBalancer:需要负载均衡器(通常都需要云服务商提供,裸机可以安装 METALLB 测试)会额外生成一个 IP 对外服务K8S 支持的负载均衡器:负载均衡器

Headless:适合数据库,clusterIp 设置为 None 就变成 Headless 了,不会再分配 IP,后面会再讲到具体用法


5)、StatefulSet

StatefulSet 是用来管理有状态的应用,例如数据库。

前面我们部署的应用,都是不需要存储数据,不需要记住状态的,可以随意扩充副本,每个副本都是一样的,可替代的。

而像数据库、Redis 这类有状态的,则不能随意扩充副本。

StatefulSet 会固定每个 Pod 的名字

statefulset.yaml:

        apiVersion: apps/v1

        kind: StatefulSet

        metadata:

          name: mongodb

        spec:

          serviceName: mongodb

          replicas: 3

          selector:

            matchLabels:

              app: mongodb

          template:

            metadata:

              labels:

                app: mongodb

            spec:

              containers:

                - name: mongo

                  image: mongo:4.4

                  # IfNotPresent 仅本地没有镜像时才远程拉,Always 永远都是从远程拉,Never 永远只用本地镜像,本地没有则报错

                  imagePullPolicyIfNotPresent

        ---

        apiVersion: v1

        kind: Service

        metadata:

          name: mongodb

        spec:

          selector:

            app: mongodb

          type: ClusterIP

          # HeadLess

          clusterIPNone

          ports:

            - port: 27017

              targetPort: 27017


应用配置:kubectl apply -f mongo.yaml


StatefulSet 特性

Service 的 CLUSTER-IP 是空的,Pod 名字也是固定的。

Pod 创建和销毁是有序的,创建是顺序的,销毁是逆序的。

Pod 重建不会改变名字,除了IP,所以不要用IP直连

微信图片_20230214104222.png

访问时,如果直接使用 Service 名字连接,会随机转发请求

要连接指定 Pod,可以这样pod名称.服务名称,如:mongo --host mongodb-0.mongodb


Web 应用连接 Mongodb

在集群内部,我们可以通过服务名字访问到不同的服务

指定连接第一个:mongodb-0.mongodb

微信图片_20230214104736.png


6)、数据持久化

kubernetes 集群不会为你处理数据的存储,我们可以为数据库挂载一个磁盘来确保数据的安全。你可以选择云存储、本地磁盘、NFS。

本地磁盘:可以挂载某个节点上的目录,但是这需要限定 pod 在这个节点上运行

云存储:不限定节点,不受集群影响,安全稳定;需要云服务商提供,裸机集群是没有的。

NFS:不限定节点,不受集群影响

kwrmidne.png

Persistent Volume Claim (PVC):对存储需求的一个申明,可以理解为一个申请单,系统根据这个申请单去找一个合适的 PV,还可以根据 PVC 自动创建 PV。

Persistent Volume (PV):描述卷的具体信息,例如磁盘大小,访问模式。类型,Local 示例

Storage Class (SC):将存储卷划分为不同的种类,例如:SSD,普通磁盘,本地磁盘,按需使用。


为什么要这么多层抽象

更好的分工,运维人员负责提供好存储,开发人员不需要关注磁盘细节,只需要写一个申请单。

方便云服务商提供不同类型的,配置细节不需要开发者关注,只需要一个申请单。

动态创建,开发人员写好申请单后,供应商可以根据需求自动创建所需存储卷。

backup.yaml:

        apiVersion: apps/v1

        kind: StatefulSet

        metadata:

          name: mongodb

        spec:

          replicas: 1

          selector:

            matchLabels:

              app: mongodb

          serviceName: mongodb

          template:

            metadata:

              labels:

                app: mongodb

            spec:

              containers:

                - image: mongo:5.0

                  imagePullPolicy: IfNotPresent

                  name: mongo

                  volumeMounts:

                    - mountPath: /data/db

                      name: mongo-data

              volumes:

                - name: mongo-data

                  persistentVolumeClaim:

                     claimName: mongodata

        ---

        apiVersion: v1

        kind: Service

        metadata:

          name: mongodb

        spec:

          clusterIP: None

          ports:

          - port: 27017

            protocol: TCP

            targetPort: 27017

          selector:

            app: mongodb

          type: ClusterIP

       

        ---

        apiVersion: v1

        kind: PersistentVolumeClaim

        metadata:

          name: mongodata

        spec:

          accessModes: ["ReadWriteOnce"]

          storageClassName: "local-storage"

          resources:

            requests:

              storage: 2Gi


        ---

        apiVersion: v1

        kind: PersistentVolume

        metadata:

          name: mongodata

        spec:

          capacity:

            storage: 2Gi

          volumeMode: Filesystem  # Filesystem(文件系统) Block(块)

          accessModes:

            - ReadWriteOnce       # 卷可以被一个节点以读写方式挂载

          persistentVolumeReclaimPolicy: Delete

          storageClassName: local-storage

          local:

            path: /root/data

          nodeAffinity:

            required:

              # 通过 hostname 限定在某个节点创建存储卷

              nodeSelectorTerms:

                - matchExpressions:

                    - key: kubernetes.io/hostname

                      operator: In

                      values:

                        - node2

        ---

        apiVersion: storage.k8s.io/v1

        kind: StorageClass

        metadata:

          name: local-storage

        provisioner: kubernetes.io/no-provisioner

        volumeBindingMode: WaitForFirstConsumer

        



微信图片_20230214111501.png


7)、ConfigMap & Secret

ConfigMap:

数据库连接地址,这种可能根据部署环境变化的,我们不应该写死在代码里。Kubernetes 为我们提供了 ConfigMap,可以方便的配置一些变量

configmap.yaml:

        apiVersion: v1

        kind: ConfigMap

        metadata:

          name: mongo-config

        data:

          mongoHost: mongodb-0.mongodb


# 应用

kubectl apply -f configmap.yaml

# 查看

kubectl get configmap mongo-config -o yaml

微信图片_20230214115829.png

Secret:

一些重要数据,例如密码、TOKEN,我们可以放到 secret 中。文档,配置证书,注意,数据要进行 Base64 编码。

secret.yaml:

        apiVersion: v1

        kind: Secret

        metadata:

          name: mongo-secret

        # Opaque 用户定义的任意数据,更多类型介绍 https://kubernetes.io/zh/docs/concepts/configuration/secret/#secret-types

        type: Opaque

        data:

          # 数据要 base64。https://tools.fun/base64.html

          mongo-username: bW9uZ291c2Vy

          mongo-password: bW9uZ29wYXNz


# 应用

kubectl apply -f secret.yaml

# 查看

kubectl get secret mongo-secret -o yaml

微信图片_20230214115853.png

mongodb.yaml:

        apiVersion: apps/v1

        kind: StatefulSet

        metadata:

          name: mongodb

        spec:

          replicas: 3

          selector:

            matchLabels:

              app: mongodb

          serviceName: mongodb

          template:

            metadata:

              labels:

                app: mongodb

            spec:

              containers:

                - name: mongo

                  image: mongo:4.4

                  # IfNotPresent 仅本地没有镜像时才远程拉,Always 永远都是从远程拉,Never 永远只用本地镜像,本地没有则报错

                  imagePullPolicy: IfNotPresent

                  env:

                  - name: MONGO_INITDB_ROOT_USERNAME

                    valueFrom:

                      secretKeyRef:

                        name: mongo-secret

                        key: mongo-username

                  - name: MONGO_INITDB_ROOT_PASSWORD

                    valueFrom:

                      secretKeyRef:

                        name: mongo-secret

                        key: mongo-password

                  # Secret 的所有数据定义为容器的环境变量,Secret 中的键名称为 Pod 中的环境变量名称

                  # envFrom:

                  # - secretRef:

                  #     name: mongo-secret


8)、Helm & 命名空间

Helm类似 npm,pip,docker hub, 可以理解为是一个软件库,可以方便快速的为我们的集群安装一些第三方软件。

使用 Helm 我们可以非常方便的就搭建出来 MongoDB / MySQL 副本集群,YAML 文件别人都给我们写好了,直接使用。

安装Helm:https://helm.sh/zh/docs/intro/install/

安装mongodb:https://artifacthub.io/packages/helm/bitnami/mongodb

# 安装

helm repo add my-repo https://charts.bitnami.com/bitnami

helm install my-release my-repo/mongodb


# 指定密码和架构

helm install my-release --set architecture="replicaset",auth.rootPassword="mongopass" my-repo/mongodb


# 删除

helm ls

helm delete my-release


# 查看密码

kubectl get secret my-release-mongodb -o json

kubectl get secret my-release-mongodb -o yaml > secret.yaml


# 临时运行一个包含 mongo client 的 debian 系统

kubectl run --namespace default my-release-mongodb-client --rm --tty -i --restart='Never' --env="MONGODB_ROOT_PASSWORD=$MONGODB_ROOT_PASSWORD" --image docker.io/bitnami/mongodb:6.0.4-debian-11-r0 --command -- bash


# 进去 mongodb,这里不懂为什么pod一直pending

mongosh admin --host "my-release-mongodb-0.my-release-mongodb-headless.default.svc.cluster.local:27017,my-release-mongodb-1.my-release-mongodb-headless.default.svc.cluster.local:27017" --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORD


# 也可以转发集群里的端口到宿主机访问 mongodb

kubectl port-forward svc/my-mongo-mongodb 27017:27018


命名空间

如果一个集群中部署了多个应用,所有应用都在一起,就不太好管理,也可以导致名字冲突等。

我们可以使用 namespace 把应用划分到不同的命名空间,跟代码里的 namespace 是一个概念,只是为了划分空间。


# 创建命名空间

kubectl create namespace testapp

# 部署应用到指定的命名空间

kubectl apply -f app.yml --namespace testapp

# 查询

kubectl get pod --namespace kube-system

可以用 kubens快速切换 namespace


# 切换命名空间

kubens kube-system

# 回到上个命名空间

kubens -

# 切换集群

kubectx minikube


9)、Ingress

Ingress 为外部访问集群提供了一个 统一 入口,避免了对外暴露集群端口;功能类似 Nginx,可以根据域名、路径把请求转发到不同的 Service。可以配置 https。

跟 LoadBalancer 有什么区别:

LoadBalancer 需要对外暴露端口,不安全;无法根据域名、路径转发流量到不同 Service,多个 Service 则需要开多个 LoadBalancer;功能单一,无法配置 https。

kwhd6dc8.png

微信图片_20230227175146.png


使用

要使用 Ingress,需要一个负载均衡器 + Ingress Controller

如果是裸机(bare metal) 搭建的集群,你需要自己安装一个负载均衡插件,可以安装 METALLB

如果是云服务商,会自动给你配置,否则你的外部 IP 会是 “pending” 状态,无法使用。

Ingress.yaml:

        apiVersion: networking.k8s.io/v1

        kind: Ingress

        metadata:

          name: simple-example

        spec:

          ingressClassName: nginx

          rules:

          - host: tools.fun

            http:

              paths:

              - path: /easydoc

                pathType: Prefix

                backend:

                  service:

                    name: service1

                    port:

                      number: 4200

              - path: /svnbucket

                pathType: Prefix

                backend:

                  service:

                    name: service2

                    port:

                      number: 8080


9)、其他

建议使用腾讯云、阿里云的容器集群功能做部署,自行部署成本太高。

WEB 可视化管理集群:可以用 Helm 快速搭建一个 kubernetes-dashboard,这样你就有了一个 WEB 界面,可以可视化的进行一些操作和管理。

图形化页面也可以用:Kuboard for K8S

用脚本搭建集群:Github 上有用户已经把裸机搭建需要做的工作写成了脚本,一个脚本就帮你初始化好集群工作:kainstall

公网搭建 K8S 集群:https://ilep2pm1ty.feishu.cn/docs/doccnah39IMGdW3sY5uZWvJaX3X

参考教程:https://k8s.easydoc.net/docs/dRiQjyTY/28366845/6GiNOzyZ/9EX8Cp45

只袄早~~~
感谢你的支持,我会继续努力!
扫码打赏,感谢您的支持!
Docker K8S Devops 

文明上网理性发言!