Kubernetes 1.20集群部署

文章目录

Kubernetes 1.20 集群部署文档

一、集群节点信息表

节点角色 硬件配置 节点IP 需安装组件
master 2C/4G(CPU≥2) 192.168.100.128 docker、kubeadm、kubelet、kubectl、flannel
node01 2C/2G 192.168.100.130 docker、kubeadm、kubelet、kubectl、flannel
node02 2C/2G 192.168.100.139 docker、kubeadm、kubelet、kubectl、flannel
Harbor节点 按需配置 (用户自行指定) docker、docker-compose、harbor-offline-v1.2.2

二、环境准备(所有节点执行)

1. 基础环境初始化(关闭防火墙、SELinux、Swap)

bash 复制代码
# 关闭防火墙并设置开机不自启
systemctl stop firewalld
systemctl disable firewalld

# 临时关闭SELinux,永久关闭需修改配置文件
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config

# 清空iptables规则
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

# 临时关闭Swap分区,永久关闭需注释配置
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab  # &代表上次匹配的Swap配置行

2. 加载IPVS模块(实现K8S服务调度)

bash 复制代码
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do 
    echo $i; 
    /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;
done

3. 设置主机名(按节点角色执行)

  • master节点

    bash 复制代码
    hostnamectl set-hostname master01
  • node01节点

    bash 复制代码
    hostnamectl set-hostname node01
  • node02节点

    bash 复制代码
    hostnamectl set-hostname node02

4. 修改Hosts文件(所有节点)

bash 复制代码
vim /etc/hosts
# 添加以下内容(IP已修正为用户指定地址)
192.168.100.128 master01
192.168.100.130 node01
192.168.100.139 node02
# 若有Harbor节点,需添加:HarborIP  Harbor域名(如192.168.100.xxx hub.kgc.com)

5. 调整内核参数(适配K8S网络)

bash 复制代码
cat > /etc/sysctl.d/kubernetes.conf << EOF
# 开启网桥模式,允许网桥流量传递到iptables
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
# 关闭IPv6协议
net.ipv6.conf.all.disable_ipv6=1
# 开启IPv4转发
net.ipv4.ip_forward=1
EOF

# 生效内核参数
sysctl --system

三、所有节点安装Docker

1. 配置Docker YUM源并安装依赖

bash 复制代码
# 安装依赖工具
yum install -y yum-utils device-mapper-persistent-data lvm2 

# 添加阿里云Docker YUM源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

# 安装Docker(默认最新稳定版,如需指定版本可加版本号,如docker-ce-20.10.9)
yum install -y docker-ce docker-ce-cli containerd.io

2. 配置Docker daemon(适配K8S)

bash 复制代码
# 创建Docker配置目录
mkdir /etc/docker

# 编写daemon.json(指定镜像加速、Cgroup驱动、日志配置)
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],  # 阿里云镜像加速
  "exec-opts": ["native.cgroupdriver=systemd"],  # 与K8S一致的Cgroup驱动
  "log-driver": "json-file",  # 日志存储格式
  "log-opts": {
    "max-size": "100m"  # 单日志文件最大100M
  }
}
EOF

# 重启Docker并设置开机自启
systemctl daemon-reload
systemctl restart docker.service
systemctl enable docker.service 

# 验证Cgroup驱动(需输出"Cgroup Driver: systemd")
docker info | grep "Cgroup Driver"

注:若阿里云加速地址不可用,可替换为华为云加速:"https://0a40cefd360026b40f39c00627fa6f20.mirror.swr.myhuaweicloud.com"

四、所有节点安装K8S组件(kubeadm、kubelet、kubectl)

1. 配置K8S YUM源(阿里云)

bash 复制代码
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0  # 关闭GPG校验(加速安装)
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

2. 安装指定版本(1.20.11)

bash 复制代码
# 安装1.20.11版本(版本需统一,避免兼容性问题)
yum install -y kubelet-1.20.11 kubeadm-1.20.11 kubectl-1.20.11

# 设置kubelet开机自启(K8S组件以Pod运行,依赖kubelet启动)
systemctl enable kubelet.service

五、部署K8S Master节点

1. 准备K8S镜像(两种方式)

方式1:本地加载镜像(推荐,避免网络问题)
bash 复制代码
# 1. 在master节点上传 v1.20.11.zip 压缩包至 /opt 目录
# 2. 解压并加载镜像
unzip v1.20.11.zip -d /opt/k8s
cd /opt/k8s/v1.20.11
for i in $(ls *.tar); do docker load -i $i; done

# 3. 复制镜像到node节点(避免重复上传)
scp -r /opt/k8s root@node01:/opt  # 复制到node01
scp -r /opt/k8s root@node02:/opt  # 复制到node02

# 4. 在node01、node02节点执行镜像加载(分别登录node节点执行)
cd /opt/k8s/v1.20.11
for i in $(ls *.tar); do docker load -i $i; done
方式2:在线拉取镜像(需保证网络通畅)
bash 复制代码
# 查看需拉取的镜像列表
kubeadm config images list

# 在线拉取(指定阿里云镜像仓库,避免访问k8s.gcr.io)
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.11

2. 初始化Master节点(两种方式)

方式1:通过配置文件初始化(推荐,可复用)
bash 复制代码
# 1. 生成默认配置文件
kubeadm config print init-defaults > /opt/kubeadm-config.yaml

# 2. 编辑配置文件(修正IP、版本、网段)
vim /opt/kubeadm-config.yaml
# 关键修改项:
11 localAPIEndpoint:
12   advertiseAddress: 192.168.100.128  # 改为master节点IP
13   bindPort: 6443
......
34 kubernetesVersion: v1.20.11  # 指定K8S版本
35 networking:
36   dnsDomain: cluster.local
37   podSubnet: "10.244.0.0/16"  # 与flannel默认网段匹配
38   serviceSubnet: 10.96.0.0/16  # Service网段
39 scheduler: {}
# 在文件末尾添加(开启ipvs模式)
--- 
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs

# 3. 执行初始化(输出日志到文件,便于后续查看)
kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log

# 4. 查看初始化日志(可选,排查问题用)
less kubeadm-init.log
方式2:通过命令行参数初始化
bash 复制代码
kubeadm init \
--apiserver-advertise-address=192.168.100.128 \  # master节点IP
--image-repository registry.aliyuncs.com/google_containers \  # 阿里云镜像仓库
--kubernetes-version=v1.20.11 \  # K8S版本
--service-cidr=10.96.0.0/16 \  # Service网段
--pod-network-cidr=10.244.0.0/16 \  # Pod网段(匹配flannel)
--token-ttl=0  # Token永久有效(默认24小时过期)

# 若用此方式,需额外开启ipvs模式:
kubectl edit cm kube-proxy -n=kube-system
# 将"mode: "改为"mode: ipvs",保存退出

3. 配置kubectl(Master节点)

bash 复制代码
# 普通用户配置(推荐)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 若用root用户,可直接执行:
# export KUBECONFIG=/etc/kubernetes/admin.conf

4. 修复集群健康状态(若kubectl get cs显示不健康)

bash 复制代码
# 编辑 scheduler 和 controller-manager 配置文件
vim /etc/kubernetes/manifests/kube-scheduler.yaml 
vim /etc/kubernetes/manifests/kube-controller-manager.yaml

# 关键修改项(两个文件均需改):
1. 将 --bind-address=127.0.0.1 改为 --bind-address=192.168.100.128(master IP)
2. 将 httpGet: 字段下的 host: 127.0.0.1 改为 host: 192.168.100.128(共两处)
3. 搜索 --port=0,将该行注释(#--port=0)

# 重启kubelet生效
systemctl restart kubelet

# 验证集群组件状态(均为 Healthy 则正常)
kubectl get cs

六、部署容器网络插件(flannel,所有节点)

方式1:本地部署(需提前准备文件)

bash 复制代码
# 1. 所有节点上传 flannel.tar 镜像至 /opt 目录,加载镜像
cd /opt
docker load < flannel.tar

# 2. master节点上传 kube-flannel.yml 文件至 /opt 目录,执行部署
kubectl apply -f kube-flannel.yml 

方式2:在线部署(需网络通畅)

bash 复制代码
# 选择任一命令执行
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 或
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

验证网络插件状态(master节点)

bash 复制代码
# 查看kube-system命名空间下的flannel Pod(均为Running则正常)
kubectl get pods -n kube-system | grep flannel

七、Node节点加入集群

1. 获取Join命令(master节点执行)

bash 复制代码
# 方式1:从初始化日志中提取(若保留了kubeadm-init.log)
grep "kubeadm join" kubeadm-init.log

# 方式2:重新生成Join命令(若Token过期或丢失)
kubeadm token create --print-join-command

2. 执行Join命令(node01、node02节点分别执行)

bash 复制代码
# 替换为实际获取的Join命令(IP已修正为master节点IP)
kubeadm join 192.168.100.128:6443 --token xxxxx.xxxxxxxxxx \
    --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

验证节点状态(master节点)

bash 复制代码
# 查看所有节点(均为Ready则正常)
kubectl get nodes
# 输出示例:
NAME       STATUS   ROLES                  AGE   VERSION
master01   Ready    control-plane,master   30m   v1.20.11
node01     Ready    <none>                 10m   v1.20.11
node02     Ready    <none>                 8m    v1.20.11

八、测试集群功能(master节点)

1. 创建Nginx Deployment

bash 复制代码
# 创建1个Nginx副本
kubectl create deployment nginx --image=nginx

# 查看Pod状态(STATUS为Running则正常)
kubectl get pods -o wide

2. 暴露Nginx服务(NodePort类型,外部可访问)

bash 复制代码
# 暴露80端口,类型为NodePort
kubectl expose deployment nginx --port=80 --type=NodePort

# 查看服务状态(获取NodePort端口,如32404)
kubectl get svc
# 输出示例:
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        1h
nginx        NodePort    10.96.56.120   <none>        80:32404/TCP   5s

3. 访问Nginx服务(外部机器或节点内部)

bash 复制代码
# 方式1:节点内部访问(用node节点IP+NodePort)
curl http://192.168.100.130:32404  # node01 IP
# 或
curl http://192.168.100.139:32404  # node02 IP

# 方式2:外部浏览器访问(需节点防火墙开放NodePort端口)
http://192.168.100.130:32404  # 替换为实际NodePort

4. 扩展Nginx副本(测试调度功能)

bash 复制代码
# 扩展为3个副本
kubectl scale deployment nginx --replicas=3

# 查看副本分布(Pod会调度到不同node节点)
kubectl get pods -o wide

九、部署K8S Dashboard(可视化界面,master节点)

1. 准备并修改Dashboard配置文件

bash 复制代码
# 1. 上传 recommended.yaml 文件至 /opt/k8s 目录
cd /opt/k8s

# 2. 编辑文件,修改Service为NodePort类型(外部可访问)
vim recommended.yaml
# 找到Service配置段,添加NodePort端口:
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001  # 添加:外部访问端口
  type: NodePort       # 添加:服务类型改为NodePort
  selector:
    k8s-app: kubernetes-dashboard

2. 部署Dashboard

bash 复制代码
kubectl apply -f recommended.yaml

# 查看Dashboard Pod状态(Running则正常)
kubectl get pods -n kubernetes-dashboard

3. 创建管理员账户并获取Token

bash 复制代码
# 1. 创建service account(dashboard-admin)
kubectl create serviceaccount dashboard-admin -n kube-system

# 2. 绑定cluster-admin角色(授予管理员权限)
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

# 3. 获取Token(复制输出的token,用于登录)
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

4. 访问Dashboard

bash 复制代码
# 浏览器访问(用master或node节点IP+30001,需用https)
https://192.168.100.128:30001  # master节点IP
# 或
https://192.168.100.130:30001  # node01节点IP

# 登录步骤:
1. 选择"Token"登录方式
2. 粘贴上一步获取的Token,点击"登录"

十、部署Harbor私有仓库(Harbor节点执行)

1. 基础配置(Harbor节点)

bash 复制代码
# 1. 设置Harbor主机名(如hub.kgc.com,可自定义)
hostnamectl set-hostname hub.kgc.com

# 2. 所有节点添加Harbor主机名映射(包括master、node01、node02)
echo 'Harbor节点IP  hub.kgc.com' >> /etc/hosts  # 替换为实际Harbor节点IP

2. 安装Docker(同步骤三,已安装可跳过)

略(参考"三、所有节点安装Docker")

3. 配置Docker支持私有仓库(所有节点)

bash 复制代码
# 编辑daemon.json,添加insecure-registries
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "insecure-registries": ["https://hub.kgc.com"]  # 添加Harbor域名(支持http)
}
EOF

# 重启Docker生效
systemctl daemon-reload
systemctl restart docker

4. 安装Docker Compose(Harbor节点)

bash 复制代码
# 1. 上传 docker-compose 文件至 /opt 目录
# 2. 移动到可执行目录并授权
cp /opt/docker-compose /usr/local/bin/
chmod +x /usr/local/bin/docker-compose

# 验证安装(输出版本则正常)
docker-compose --version

5. 安装并配置Harbor

bash 复制代码
# 1. 上传 harbor-offline-installer-v1.2.2.tgz 至 /opt 目录,解压
cd /opt
tar zxvf harbor-offline-installer-v1.2.2.tgz
cd harbor/

# 2. 编辑Harbor配置文件
vim harbor.cfg
# 关键修改项:
5  hostname = hub.kgc.com  # Harbor域名(与hosts映射一致)
9  ui_url_protocol = https  # 访问协议(https)
24 ssl_cert = /data/cert/server.crt  # 证书路径
25 ssl_cert_key = /data/cert/server.key  # 私钥路径
59 harbor_admin_password = Harbor12345  # 管理员密码(可自定义)

6. 生成SSL证书(Harbor节点)

bash 复制代码
# 1. 创建证书目录
mkdir -p /data/cert
cd /data/cert

# 2. 生成私钥(输入密码,如123456,后续需重复输入)
openssl genrsa -des3 -out server.key 2048

# 3. 生成证书签名请求(CSR)
openssl req -new -key server.key -out server.csr
# 按提示输入(关键项:Common Name需为Harbor域名hub.kgc.com):
Enter pass phrase for server.key: 123456(输入私钥密码)
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BJ(省份,自定义)
Locality Name (eg, city) [Default City]:BJ(城市,自定义)
Organization Name (eg, company) [Default Company Ltd]:BENET(组织名,自定义)
Organizational Unit Name (eg, section) []:BENET(部门名,自定义)
Common Name (eg, your name or your server's hostname) []:hub.kgc.com(关键:Harbor域名)
Email Address []:admin@benet.com(邮箱,自定义)
A challenge password []:(直接回车,无需密码)
An optional company name []:(直接回车)

# 4. 备份私钥并清除密码(避免启动Harbor时需输入密码)
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key  # 输入私钥密码123456

# 5. 生成自签名证书(有效期1000天)
openssl x509 -req -days 1000 -in server.csr -signkey server.key -out server.crt

# 6. 授权证书文件
chmod +x /data/cert/*

7. 启动Harbor

bash 复制代码
# 回到Harbor安装目录,执行安装脚本
cd /opt/harbor/
./install.sh

# 验证Harbor状态(所有容器均为Up则正常)
docker-compose ps

8. 访问Harbor并上传镜像

(1)浏览器访问Harbor
bash 复制代码
# 访问地址(https+Harbor节点IP或域名+443端口,默认443可省略)
https://hub.kgc.com

# 登录:
用户名:admin
密码:Harbor12345(harbor.cfg中配置的密码)
(2)上传Nginx镜像到Harbor(任意node节点)
bash 复制代码
# 1. 登录Harbor(输入用户名admin,密码Harbor12345)
docker login -u admin -p Harbor12345 https://hub.kgc.com

# 2. 给本地Nginx镜像打标签(格式:Harbor域名/项目名/镜像名:版本)
docker tag nginx:latest hub.kgc.com/library/nginx:v1  # library为默认项目

# 3. 上传镜像到Harbor
docker push hub.kgc.com/library/nginx:v1
(3)从Harbor拉取镜像部署(master节点)
bash 复制代码
# 1. 删除原有Nginx Deployment(可选)
kubectl delete deployment nginx

# 2. 从Harbor拉取镜像创建Deployment(3个副本,暴露80端口)
kubectl create deployment nginx-deployment --image=hub.kgc.com/library/nginx:v1 --port=80 --replicas=3

# 3. 暴露服务(NodePort类型,外部可访问)
kubectl expose deployment nginx-deployment --port=30000 --target-port=80 --type=NodePort

# 4. 查看服务和Pod状态
kubectl get svc,pods
# 访问测试(用node节点IP+NodePort)
curl http://192.168.100.130:32xxxx  # 替换为实际NodePort

十一、内核参数优化(所有节点,可选)

bash 复制代码
# 编写优化配置文件
cat > /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0  # 禁止使用Swap,仅OOM时允许
vm.overcommit_memory=1  # 不检查物理内存是否充足
vm.panic_on_oom=0  # 开启OOM(避免系统崩溃)
fs.inotify.max_user_instances=8192  # 最大实例数
fs.inotify.max_user_watches=1048576  # 最大监控数
fs.file-max=52706963  # 最大文件句柄数
fs.nr_open=52706963  # 最大打开文件数(内核4.4+支持)
net.ipv6.conf.all.disable_ipv6=1  # 关闭IPv6
net.netfilter.nf_conntrack_max=2310720  # 最大连接数
EOF

# 生效配置
sysctl --system

关键注意事项

  1. IP一致性 :所有配置文件、命令中的节点IP需与用户指定的192.168.100.128(master)192.168.100.130(node01)192.168.100.139(node02)严格一致,避免因IP错误导致节点无法通信。
  2. Token有效性kubeadm join命令中的Token和Hash需从master节点实时生成(通过kubeadm token create --print-join-command),文档中示例Token无效。
  3. 镜像兼容性:K8S 1.20.11需搭配对应版本的flannel、Docker(推荐20.10.x系列),避免版本不兼容。
  4. Harbor配置 :若Harbor节点IP变更,需同步修改所有节点的/etc/hosts和Docker的daemon.json,确保镜像拉取/上传正常。
相关推荐
不想画图11 分钟前
Kubernetes(八)——PV和PVC
云原生·容器·kubernetes
Serverless社区23 分钟前
探秘 AgentRun|基于 Serverless 的 AI Agent 沙箱工程化之路
运维·阿里云·云原生·serverless·函数计算
阿里云云原生1 小时前
Nacos 生产级安全实践:精细化鉴权、灰度平滑过渡与全量操作审计
安全·阿里云·云原生·nacos
Ashmcracker2 小时前
导入Azure AKS集群到Rancher
microsoft·kubernetes·rancher·azure
码农小卡拉3 小时前
Docker Compose部署EMQX集群详细教程(Ubuntu环境优化版)
mqtt·ubuntu·docker·容器·emqx
WilliamHu.4 小时前
Windows 环境下使用 Docker 成功部署 Dify(完整实战记录)
运维·docker·容器
叫致寒吧4 小时前
Kubernetes 安全机制
安全·容器·kubernetes
Cyber4K5 小时前
【Kubernetes专项】零故障升级之Pod健康探测
云原生·容器·kubernetes
能不能别报错5 小时前
企业级生产级K8s平台
云原生·容器·kubernetes
幼稚园的山代王5 小时前
从 0 到 1,读懂 Kubernetes 核心概念
云原生·容器·kubernetes