方案概述 服务版本 安装Kubernetes 参考文档: 中文步骤, 包括配置国内镜像服务器 http://www.cdyszyxy.cn/cwtj/616625.html 官方文档 https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/ containerd, runc和CNI插件安装步骤 https://github.com/containerd/containerd/blob/main/docs/getting-started.md crictl安装文档: https://github.com/kubernetes-sigs/cri-tools/blob/master/docs/crictl.md 在VM执行下列命令 转发 IPv4 并让 iptables 看到桥接流量 依次在服务器直行下列命令 下面的命令只在主VM执行 下面命令在其它VM执行加入集群 启用crictl 本地使用kubectl 复制服务器.kube/config的内容到本地相同目录, 安装kubectl后就可以访问了. 本地通过TLS Tunnel使用kubectl 修改~.kube/config 开启tunnel 使用Lens图形化管理Kubernetes集群 下载后注册为免费用户https://k8slens.dev/desktop.html 首页Catalog -> Cluster -> 点击加号, 打开.kube/config文件添加集群. 在Cluster里点击右侧三个点选择Connect就可以使用了. 安装Helm 安装Traefik 安装Traefik后会自动生成service, 查看80端口对应的node port就是外网端口. kubectl get svc -n kube-system 配置对应的IngressRoute后就可以访问dashboard了. kubectl create -f traefik_ingress.yml 使用SSH隧道访问Traefik路由 把Traefik上配置的虚拟域名绑定到本地host文件 vi /etc/hosts 把Traefik的http服务端口(node port)映射到本地80端口 访问http://node1.test.com/dashboard/ 安装Docker Registry 生成docker密码, 把htpasswd放在node2的/opt/docker/auth, 后面要放在secret里面 创建系统服务的命名空间 部署docker服务 kubectl create -f docker_registry.yml 获取docker registry地址 Cluster IP给kubernetes配置image用, NodePort需要映射出去给本地用外网IP pushi image kubectl get svc -n kube-system 测试Docker服务器 本地浏览器访问http://vm_public_ip:32299/v2/_catalog 输入用户名密码后可以登录 本地映射Docker服务器端口 开发机Docker Desktop访问insecure registry node1.test.com是hosts文件配置的本地ip, 5000端口是ssl隧道映射的docker服务的node port 不管docker registry的pod运行在哪台VM, Node Port都会映射到所有VM 开发机rancher-desktop insecure registry 在开发机运行 添加下面的配置 开发机push Docker image到服务器Docker registry 服务器上检查image是否已经上传 开发机使用Maven build并pushi Docker image服务器docker registry 项目代码:https://github.com/kjstart/mavendemo 需要在本地Maven配置docker服务器的账号密码, 这里的server id和项目pom.xml里要对应 vi ~/.m2/settings.xml 配置好后就可以build项目了 注意Docker镜像命名不能用驼峰语法(ExampleName)会报Broken Pipe错误. 配置服务器containerd insecured http和auth 这步需要在每个VM(node)配置, 10.200.174.243是docker registry的ClusterIP, 请酌情修改. sudo vi /etc/containerd/config.toml sudo mkdir -p /etc/containerd/certs.d/10.200.172.167:5000 sudo vi /etc/containerd/certs.d/10.200.172.167:5000/hosts.toml sudo systemctl restart containerd 创建应用程序的命名空间 创建应用程序配置 创建应用程序秘钥 也可以用Lens创建, data的值直接填原文,不用base64编码 部署一个项目 这是demo项目https://github.com/kjstart/mavendemo 访问虚拟机上运行的服务 如果一些服务不迁移到k8s上,可以用下面的方法访问 比如要访问192.168.1.160:8161 kubectl create -f mysql-vm.yml k get svc -n infra 然后在k8s pod里就可以用Service的CLUSTER-IP访问服务了. 以后迁移服务, Service的IP不变 外网访问应用程序 后续要把公网域名映射到VM的Traefik端口, IngressRoute的域名做对应修改. 应用的端口在container和service暴露, 并通过IngressRoute映射为路径, 这里是/mavendemo http://node1.test.com:31708/mavendemo/hello 内网访问应用程序 使用service定义的服务名和应用程序暴露的端口来访问, 在container和service层都要暴露端口 添加新的Node(VM)到集群 在主节点生成token,24小时内可重复使用 kubeadm token create 在新节点完成K8s安装后(参考上面的安装Kubernetes部分),运行下面的命令 kubeadm join 192.168.113.141:6443 --token 你的token --discovery-token-ca-cert-hash sha256:f96f75de5775c1a66caa6ad5cb8783f4251db5c3137ac42c511f794b95afac33 允许K8s master节点部署应用 master节点(control plane)默认是不会部署应用程序的pod的. 如果需要部署, 编辑master节点, 删除NoSchedule的taint就可以了. kubelet常用alias 放在.bash_profile里, 可简化操作 参考文档 http://www.cdyszyxy.cn/cwtj/616625.html https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/ https://github.com/containerd/containerd/blob/main/docs/getting-started.md https://github.com/kubernetes-sigs/cri-tools/blob/master/docs/crictl.md https://helm.sh/docs/intro/install/ https://doc.traefik.io/traefik/getting-started/install-traefik/ https://blog.csdn.net/avatar_2009/article/details/109807878 https://stackoverflow.com/questions/70971697/modify-docker-daemon-configuration-in-rancher-desktop-vm https://github.com/containerd/containerd/blob/main/docs/cri/config.md#registry-configuration https://github.com/containerd/containerd/blob/main/docs/hosts.md https://blog.csdn.net/weixin_44742630/article/details/126095739 https://www.cnblogs.com/yangmeichong/p/16661444.html https://blog.csdn.net/weixin_43616190/article/details/126415601 https://kubernetes.io/docs/concepts/configuration/configmap/ https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/ https://blog.csdn.net/Thomson_tian/article/details/117218281 https://blog.csdn.net/sanhewuyang/article/details/128369826