说明
环境准备,根据自己情况而定
节点名 |
IP地址 |
CPU |
内存 |
硬盘 |
操作系统 |
Docker版本 |
k8s-master |
172.31.2.214 |
8核 |
16G |
128G |
Centos7_2209 |
24.0.2 |
k8s-node01 |
172.31.2.215 |
8核 |
16G |
128G |
Centos7_2209 |
24.0.2 |
k8s-node02 |
172.31.2.216 |
8核 |
16G |
128G |
Centos7_2209 |
24.0.2 |
- 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令
- 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)
- 2 CPU 核或更多
- 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
- 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。
- 开启机器上的某些端口。
- 禁用交换分区。为了保证kubelet正常工作,你必须禁用交换分区。
一、安装kubeadm
🧯 环境配置
在所有机器中执行
| # 各个机器设置自己的主机名 |
| hostnamectl set-hostname master |
| hostnamectl set-hostname node01 |
| hostnamectl set-hostname node02 |
| |
| # 添加hosts文件,根据自己情况修改 |
| cat >> /etc/hosts << EOF |
| 172.31.2.214 master |
| 172.31.2.215 node01 |
| 172.31.2.216 node02 |
| EOF |
| |
| # SELinux 设置禁用 |
| sudo setenforce 0 |
| sudo sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config |
| |
| # 关闭swap |
| swapoff -a |
| sed -ri 's/.*swap.*/#&/' /etc/fstab |
| |
| # 允许 iptables 检查桥接流量 |
| cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf |
| br_netfilter |
| EOF |
| |
| cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf |
| net.bridge.bridge-nf-call-ip6tables = 1 |
| net.bridge.bridge-nf-call-iptables = 1 |
| EOF |
| sudo sysctl --system |
| |
🧯 安装kubelet、kubeadm、kubectl
所有机器中执行
| # 添加kebernetes源 |
| cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo |
| [kubernetes] |
| name=Kubernetes |
| baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 |
| enabled=1 |
| gpgcheck=0 |
| repo_gpgcheck=0 |
| gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg |
| http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg |
| exclude=kubelet kubeadm kubectl |
| EOF |
| |
| |
| #安装所需主键,并让kubelet开机自启 |
| sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes |
| sudo systemctl enable --now kubelet |
二、使用kubeadm引导集群
🔧 下载各个机器需要的镜像
所有机器中执行
| sudo tee ./images.sh <<-'EOF' |
| #!/bin/bash |
| images=( |
| kube-apiserver:v1.20.9 |
| kube-proxy:v1.20.9 |
| kube-controller-manager:v1.20.9 |
| kube-scheduler:v1.20.9 |
| coredns:1.7.0 |
| etcd:3.4.13-0 |
| pause:3.2 |
| ) |
| for imageName in ${images[@]} ; do |
| docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName |
| done |
| EOF |
| |
| chmod +x ./images.sh && ./images.sh |
🔧 初始化主节点
在master节点执行
| #主节点初始化 |
| kubeadm init \ |
| --apiserver-advertise-address=172.31.2.214 \ |
| --control-plane-endpoint=master \ |
| --image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \ |
| --kubernetes-version v1.20.9 \ |
| --service-cidr=10.96.0.0/16 \ |
| --pod-network-cidr=192.168.0.0/16 |
| |
| # --apiserver-advertise-address修改为master所在的地址 |
| # --control-plane-endpoin修改为master主机名,前提要在hosts文件中有记录 |
| # 其余可不修改,修改的话所有网络不能重叠 |
部署成功信息,需要添加master或者node按照提示执行即可!
| Your Kubernetes control-plane has initialized successfully! |
| |
| To start using your cluster, you need to run the following as a regular user: |
| |
| mkdir -p $HOME/.kube |
| sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config |
| sudo chown $(id -u):$(id -g) $HOME/.kube/config |
| |
| Alternatively, if you are the root user, you can run: |
| |
| export KUBECONFIG=/etc/kubernetes/admin.conf |
| |
| You should now deploy a pod network to the cluster. |
| Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: |
| https://kubernetes.io/docs/concepts/cluster-administration/addons/ |
| |
| You can now join any number of control-plane nodes by copying certificate authorities |
| and service account keys on each node and then running the following as root: |
| |
| kubeadm join master:6443 --token hums8f.vyx71prsg74ofce7 \ |
| --discovery-token-ca-cert-hash sha256:a394d059dd51d68bb007a532a037d0a477131480ae95f75840c461e85e2c6ae3 \ |
| --control-plane |
| |
| Then you can join any number of worker nodes by running the following on each as root: |
| |
| kubeadm join master:6443 --token hums8f.vyx71prsg74ofce7 \ |
| --discovery-token-ca-cert-hash sha256:a394d059dd51d68bb007a532a037d0a477131480ae95f75840c461e85e2c6ae3 |
| #查看集群所有节点 |
| kubectl get nodes |
| |
| #根据配置文件,给集群创建资源 |
| kubectl apply -f xxxx.yaml |
| |
| # 查看集群pods状态 |
| kubectl get pods -A |
🔧 根据提示信息操其他步骤
- 设置.kube/config (复制上面输出信息内容)
| mkdir -p $HOME/.kube |
| sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config |
| sudo chown $(id -u):$(id -g) $HOME/.kube/config |
- 安装网络组件(calico)
| wget https://docs.projectcalico.org/v3.18/manifests/calico.yaml |
| |
| kubectl apply -f calico.yaml |
| |
| # 等待 Calico 组件部署完成。可以运行以下命令来检查它们的状态 |
| watch kubectl get pods -n kube-system |
| |
| # 验证 Calico 安装是否成功。可以运行以下命令来获取网络插件的状态 |
| kubectl get daemonsets.apps calico-node -n kube-system |
| |
| # callco组件官网地址 |
| # https://docs.tigera.io/calico/latest/getting-started/kubernetes/self-managed-onprem/onpremises |
- 加入node节点
| # 在node节点执行,根据自身修改 |
| kubeadm join master:6443 --token hums8f.vyx71prsg74ofce7 \ |
| --discovery-token-ca-cert-hash sha256:a394d059dd51d68bb007a532a037d0a477131480ae95f75840c461e85e2c6ae3 |
默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成:
kubeadm token create --print-join-command
kubeadm token list
三、创建测试pod
🧰 部署nginx测试
| cat > nginx.yaml << EOF |
| apiVersion: apps/v1 |
| kind: Deployment |
| metadata: |
| name: nginx-deployment |
| labels: |
| app: nginx |
| spec: |
| replicas: 3 |
| selector: |
| matchLabels: |
| app: nginx |
| template: |
| metadata: |
| labels: |
| app: nginx |
| spec: |
| containers: |
| - name: nginx |
| image: nginx |
| |
| EOF |
| |
| # 执行 |
| kubectl apply -f nginx.yaml |
| cat > nginx-service.yaml << EOF |
| apiVersion: v1 |
| kind: Service |
| metadata: |
| name: nginx-service |
| spec: |
| selector: |
| app: nginx |
| type: NodePort |
| ports: |
| - protocol: TCP |
| port: 80 |
| targetPort: 80 |
| |
| EOF |
| |
| # 执行 |
| kubectl apply -f nginx-service.yaml |
| |
| # 查看服务(Running说明启动成功) |
| kubectl get pod,svc |
四、部署Dashboard控制台(可选)
📊 控制台部署
kubernetes官方提供的可视化界面
https://github.com/kubernetes/dashboard
| kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml |
| |
| # 因为文件是存放在github上的,可能需要使用特殊上网办法 |
📊 设置访问端口
| kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard |
| # 搜索type: ClusterIP |
| # 将type: ClusterIP改为 type: NodePort |
| |
| # 查看是否开放控制台端口 |
| kubectl get svc -A |grep kubernetes-dashboard |
访问:https://集群任意IP:端口 例如:https://172.31.2.214:32759
📊 创建访问账户
| cat > user.yaml << EOF |
| apiVersion: v1 |
| kind: ServiceAccount |
| metadata: |
| name: admin-user |
| namespace: kubernetes-dashboard |
| --- |
| apiVersion: rbac.authorization.k8s.io/v1 |
| kind: ClusterRoleBinding |
| metadata: |
| name: admin-user |
| roleRef: |
| apiGroup: rbac.authorization.k8s.io |
| kind: ClusterRole |
| name: cluster-admin |
| subjects: |
| - kind: ServiceAccount |
| name: admin-user |
| namespace: kubernetes-dashboard |
| EOF |
| |
| #执行创建脚本 |
| kubectl apply -f user.yaml |
📊 令牌访问
| # 获取访问令牌 |
| kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}" |
| # 获取到的登录令牌 |
| eyJhbGciOiJSUzI1NiIsImtpZCI6InpXSkU0TjhCUmVKQzBJaC03Nk9ES2NMZ1daRTRmQ1FMZU9rRUJ3VXRnM3MifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXgyczhmIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIzOTZmYjdlNS0wMjA2LTQxMjctOGQzYS0xMzRlODVmYjU0MDAiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.Hf5mhl35_R0iBfBW7fF198h_klEnN6pRKfk_roAzOtAN-Aq21E4804PUhe9Rr9e_uFzLfoFDXacjJrHCuhiML8lpHIfJLK_vSD2pZNaYc2NWZq2Mso-BMGpObxGA23hW0nLQ5gCxlnxIAcyE76aYTAB6U8PxpvtVdgUknBVrwXG8UC_D8kHm9PTwa9jgbZfSYAfhOHWmZxNYo7CF2sHH-AT_WmIE8xLmB7J11vDzaunv92xoUoI0ju7OBA2WRr61bOmSd8WJgLCDcyBblxz4Wa-3zghfKlp0Rgb8l56AAI7ML_snF59X6JqaCuAcCJjIu0FUTS5DuyIObEeXY-z-Rw |
📊 登录界面
img
进阶kubernetes高可用方案:https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/ha-topology/
本文作者:Ronnybox
本文链接:https://www.cnblogs.com/ronnybox/p/17522832.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)