Kubernetes 1.20集群部署
文章目录
- Kubernetes 1.20 集群部署文档
- 一、集群节点信息表
- 二、环境准备(所有节点执行)
- 1. 基础环境初始化(关闭防火墙、SELinux、Swap)
- 2. 加载IPVS模块(实现K8S服务调度)
- 3. 设置主机名(按节点角色执行)
- 4. 修改Hosts文件(所有节点)
- 5. 调整内核参数(适配K8S网络)
- 三、所有节点安装Docker
- 1. 配置Docker YUM源并安装依赖
- 2. 配置Docker daemon(适配K8S)
- 四、所有节点安装K8S组件(kubeadm、kubelet、kubectl)
- 1. 配置K8S YUM源(阿里云)
- 2. 安装指定版本(1.20.11)
- 五、部署K8S Master节点
- 1. 准备K8S镜像(两种方式)
- 方式1:本地加载镜像(推荐,避免网络问题)
- 方式2:在线拉取镜像(需保证网络通畅)
- 2. 初始化Master节点(两种方式)
- 方式1:通过配置文件初始化(推荐,可复用)
- 方式2:通过命令行参数初始化
- 3. 配置kubectl(Master节点)
- 4. 修复集群健康状态(若kubectl get cs显示不健康)
- 六、部署容器网络插件(flannel,所有节点)
- 方式1:本地部署(需提前准备文件)
- 方式2:在线部署(需网络通畅)
- 验证网络插件状态(master节点)
- 七、Node节点加入集群
- 1. 获取Join命令(master节点执行)
- 2. 执行Join命令(node01、node02节点分别执行)
- 验证节点状态(master节点)
- 八、测试集群功能(master节点)
- 1. 创建Nginx Deployment
- 2. 暴露Nginx服务(NodePort类型,外部可访问)
- 3. 访问Nginx服务(外部机器或节点内部)
- 4. 扩展Nginx副本(测试调度功能)
- 九、部署K8S Dashboard(可视化界面,master节点)
- 1. 准备并修改Dashboard配置文件
- 2. 部署Dashboard
- 3. 创建管理员账户并获取Token
- 4. 访问Dashboard
- 十、部署Harbor私有仓库(Harbor节点执行)
- 1. 基础配置(Harbor节点)
- 2. 安装Docker(同步骤三,已安装可跳过)
- 3. 配置Docker支持私有仓库(所有节点)
- 4. 安装Docker Compose(Harbor节点)
- 5. 安装并配置Harbor
- 6. 生成SSL证书(Harbor节点)
- 7. 启动Harbor
- 8. 访问Harbor并上传镜像
- (1)浏览器访问Harbor
- (2)上传Nginx镜像到Harbor(任意node节点)
- (3)从Harbor拉取镜像部署(master节点)
- 十一、内核参数优化(所有节点,可选)
- 关键注意事项
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)
# 关闭防火墙并设置开机不自启
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服务调度)
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节点:
hostnamectl set-hostname master01
- node01节点:
hostnamectl set-hostname node01
- node02节点:
hostnamectl set-hostname node02
4. 修改Hosts文件(所有节点)
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网络)
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源并安装依赖
# 安装依赖工具
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)
# 创建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源(阿里云)
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)
# 安装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:本地加载镜像(推荐,避免网络问题)
# 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:在线拉取镜像(需保证网络通畅)
# 查看需拉取的镜像列表
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:通过配置文件初始化(推荐,可复用)
# 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:通过命令行参数初始化
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节点)
# 普通用户配置(推荐)
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显示不健康)
# 编辑 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:本地部署(需提前准备文件)
# 1. 所有节点上传 flannel.tar 镜像至 /opt 目录,加载镜像
cd /opt
docker load < flannel.tar# 2. master节点上传 kube-flannel.yml 文件至 /opt 目录,执行部署
kubectl apply -f kube-flannel.yml
方式2:在线部署(需网络通畅)
# 选择任一命令执行
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节点)
# 查看kube-system命名空间下的flannel Pod(均为Running则正常)
kubectl get pods -n kube-system | grep flannel
七、Node节点加入集群
1. 获取Join命令(master节点执行)
# 方式1:从初始化日志中提取(若保留了kubeadm-init.log)
grep "kubeadm join" kubeadm-init.log# 方式2:重新生成Join命令(若Token过期或丢失)
kubeadm token create --print-join-command
2. 执行Join命令(node01、node02节点分别执行)
# 替换为实际获取的Join命令(IP已修正为master节点IP)
kubeadm join 192.168.100.128:6443 --token xxxxx.xxxxxxxxxx \--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
验证节点状态(master节点)
# 查看所有节点(均为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
# 创建1个Nginx副本
kubectl create deployment nginx --image=nginx# 查看Pod状态(STATUS为Running则正常)
kubectl get pods -o wide
2. 暴露Nginx服务(NodePort类型,外部可访问)
# 暴露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服务(外部机器或节点内部)
# 方式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副本(测试调度功能)
# 扩展为3个副本
kubectl scale deployment nginx --replicas=3# 查看副本分布(Pod会调度到不同node节点)
kubectl get pods -o wide
九、部署K8S Dashboard(可视化界面,master节点)
1. 准备并修改Dashboard配置文件
# 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-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
spec:ports:- port: 443targetPort: 8443nodePort: 30001 # 添加:外部访问端口type: NodePort # 添加:服务类型改为NodePortselector:k8s-app: kubernetes-dashboard
2. 部署Dashboard
kubectl apply -f recommended.yaml# 查看Dashboard Pod状态(Running则正常)
kubectl get pods -n kubernetes-dashboard
3. 创建管理员账户并获取Token
# 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
# 浏览器访问(用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节点)
# 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支持私有仓库(所有节点)
# 编辑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节点)
# 1. 上传 docker-compose 文件至 /opt 目录
# 2. 移动到可执行目录并授权
cp /opt/docker-compose /usr/local/bin/
chmod +x /usr/local/bin/docker-compose# 验证安装(输出版本则正常)
docker-compose --version
5. 安装并配置Harbor
# 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节点)
# 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
# 回到Harbor安装目录,执行安装脚本
cd /opt/harbor/
./install.sh# 验证Harbor状态(所有容器均为Up则正常)
docker-compose ps
8. 访问Harbor并上传镜像
(1)浏览器访问Harbor
# 访问地址(https+Harbor节点IP或域名+443端口,默认443可省略)
https://hub.kgc.com# 登录:
用户名:admin
密码:Harbor12345(harbor.cfg中配置的密码)
(2)上传Nginx镜像到Harbor(任意node节点)
# 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节点)
# 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
十一、内核参数优化(所有节点,可选)
# 编写优化配置文件
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
关键注意事项
- IP一致性:所有配置文件、命令中的节点IP需与用户指定的
192.168.100.128(master)
、192.168.100.130(node01)
、192.168.100.139(node02)
严格一致,避免因IP错误导致节点无法通信。 - Token有效性:
kubeadm join
命令中的Token和Hash需从master节点实时生成(通过kubeadm token create --print-join-command
),文档中示例Token无效。 - 镜像兼容性:K8S 1.20.11需搭配对应版本的flannel、Docker(推荐20.10.x系列),避免版本不兼容。
- Harbor配置:若Harbor节点IP变更,需同步修改所有节点的
/etc/hosts
和Docker的daemon.json
,确保镜像拉取/上传正常。