#yyds干货盘点#快速搭建k8s集群

一万年来谁著史,三千里外欲封侯。这篇文章主要讲述#yyds干货盘点#快速搭建k8s集群相关的知识,希望能为你提供帮助。
1.选好作为k8s节点的主机虚拟机跟物理机都可以

      ip
        name
      node
    192.168.11.1
k8s-master
    master
    192.168.11.2
【#yyds干货盘点#快速搭建k8s集群】k8s-node01
      node
    192.168.11.3
k8s-node02
      node
192.168.11.1 k8s-master
192.168.11.1 k8s-node01
192.168.11.3 k8s-node02

echo "192.168.11.1 k8s-master" > > /etc/hosts & &
echo "192.168.11.2 k8s-node01" > > /etc/hosts & &
echo "192.168.11.3 k8s-node01" > > /etc/hosts
这里选三台机器作为k8s集群的节点
修改hostname 三台机器对应修改//脚本也有修改
hostnamectl set-hostname k8s-master

2.修改node脚本文件install-node.sh (?每个节点都需要执行?)
#!/bin/sh

##### 在 master 节点和 worker 节点都要执行 【所有机器执行】

# 加载环境变量
. /etc/profile
. /etc/bashrc

#################################
#修改主机名称
hostnamectl set-hostnamek8s-master
#hostnamectl set-hostnamek8s-node01
#hostnamectl set-hostnamek8s-node02

###############################################
# 添加主机名与IP对应关系(每台主机必须设置主机名)
# 如下命令:没有则添加信息若使用请根据自身主机情况修改 ★★★★★ 「你需要修改处」
grep 192.168.63.10.*k8s-master /etc/hosts || echo "192.168.63.10k8s-master" > > /etc/hosts
grep 192.168.63.2.*k8s-node01 /etc/hosts || echo "192.168.63.2k8s-node01" > > /etc/hosts
grep 192.168.63.3.*k8s-node02 /etc/hosts || echo "192.168.63.3k8s-node02" > > /etc/hosts


###############################################
# 必要的基础配置或包安装
## 必须安装 nfs-utils 才能挂载 nfs 网络存储
yum install -y nfs-utils
## wget 用于下载文件
yum install -y wget
## 其他必要包
yum install -y conntrack ipvsadm ipset


# 关闭 防火墙
systemctl stop firewalld
systemctl disable firewalld
systemctl stop iptables
systemctl disable iptables

# 关闭 SeLinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

# 关闭 swap ,本次涉及的机器没有swap,因此注释了
## 如果有swap分区则放开注释
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak | grep -v swap > /etc/fstab

# 时间设置
## 时区设置:东八区,上海
ls -l /etc/localtime | grep Asia/Shanghai || (rm -f /etc/localtime & & ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime)
## 时间同步定时任务:没有则添加定,进行时间同步
crontab -l | grep ntpdate || echo -e "# time sync\\n*/10 * * * * /usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2> & 1" > > /var/spool/cron/root
## 查看硬件时间 hwclock --show
## 系统时间同步到硬件时间
hwclock --systohc

# 关闭邮件服务
systemctl stop postfix.service & & systemctl disable postfix.service



###############################################
# 修改 /etc/sysctl.conf
# 开启 ip_forward 转发并解决流量路由不正确问题
# 如果有配置,则修改
sed -i "s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward = 1#g"/etc/sysctl.conf
sed -i "s#^net.ipv4.tcp_tw_recycle.*#net.ipv4.tcp_tw_recycle = 0#g"/etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables = 1#g"/etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables = 1#g"/etc/sysctl.conf
# IPv6 转发
sed -i "s#^net.ipv6.conf.all.forwarding.*#net.ipv6.conf.all.forwarding = 1#g"/etc/sysctl.conf
sed -i "s#^net.netfilter.nf_conntrack_max.*#net.netfilter.nf_conntrack_max = 2310720#g"/etc/sysctl.conf
## 如下两条非必要
sed -i "s#^fs.file-max.*#fs.file-max = 52706963#g"/etc/sysctl.conf
sed -i "s#^fs.nr_open.*#fs.nr_open = 52706963#g"/etc/sysctl.conf

# 如果没有,追加
grep net.ipv4.ip_forward = 1 /etc/sysctl.conf|| echo "net.ipv4.ip_forward = 1" > > /etc/sysctl.conf
grep net.ipv4.tcp_tw_recycle = 0 /etc/sysctl.conf|| echo "net.ipv4.tcp_tw_recycle = 0" > > /etc/sysctl.conf
grep net.bridge.bridge-nf-call-ip6tables = 1 /etc/sysctl.conf|| echo "net.bridge.bridge-nf-call-ip6tables = 1" > > /etc/sysctl.conf
grep net.bridge.bridge-nf-call-iptables = 1 /etc/sysctl.conf|| echo "net.bridge.bridge-nf-call-iptables = 1" > > /etc/sysctl.conf
grep net.ipv6.conf.all.forwarding = 1 /etc/sysctl.conf|| echo "net.ipv6.conf.all.forwarding = 1"> > /etc/sysctl.conf
grep net.netfilter.nf_conntrack_max = 2310720 /etc/sysctl.conf|| echo "net.netfilter.nf_conntrack_max = 2310720"> > /etc/sysctl.conf
grep fs.file-max = 52706963 /etc/sysctl.conf|| echo "fs.file-max = 52706963"> > /etc/sysctl.conf
grep fs.nr_open = 52706963/etc/sysctl.conf|| echo "fs.nr_open = 52706963"> > /etc/sysctl.conf

# 执行命令以生效
sysctl -p
#### 说明:上面的命令中/etc/sysctl.conf可以用/etc/sysctl.d/k8s.conf替换;生效使用sysctl -p /etc/sysctl.d/k8s.conf 命令


###############################################
# kube-proxy 开启ipvs的前置条件【本步骤可忽略,但推荐使用IPVS】
modprobe br_netfilter

cat > /etc/sysconfig/modules/ipvs.modules < < EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules & & bash /etc/sysconfig/modules/ipvs.modules & & lsmod | grep -e ip_vs -e nf_conntrack_ipv4



###############################################
# 安装 docker
## 参考文档如下
# https://www.cnblogs.com/zhanglianghhh/p/9891293.html
# https://docs.docker.com/install/linux/docker-ce/centos/
# https://docs.docker.com/install/linux/linux-postinstall/

## 卸载旧版本根据需要放开注释
yum remove -y docker \\
docker-client \\
docker-client-latest \\
docker-common \\
docker-latest \\
docker-latest-logrotate \\
docker-logrotate \\
docker-selinux \\
docker-engine-selinux \\
docker-engine

rm -rf /etc/systemd/system/docker.service.d
rm -rf /var/lib/docker
rm -rf /var/run/docker


## 设置 docker yum repository
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

## 安装docker
# yum install -y docker-ce
yum -y install docker-ce-20.10.7 docker-ce-cli-20.10.7containerd.io

## 启动docker服务,这样可以创建/etc/docker目录
systemctl start docker

## 配置daemon
## 1、修改docker Cgroup Driver为systemd;2、日志格式设定
## 如果不修改,在添加 worker 节点时可能会碰到如下错误
## [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd".
## Please follow the guide at https://kubernetes.io/docs/setup/cri/
cat > /etc/docker/daemon.json < < EOF

"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors":["http://hub-mirror.c.163.com"],
"insecure-registries": ["172.16.2.164:80"],
"log-driver": "json-file",
"log-opts":
"max-size": "100m"


EOF

## 开机自启动
systemctl stop docker & & systemctl daemon-reload & & systemctl enable docker & & systemctl start docker



###############################################
# 配置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
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF


# 卸载旧版本根据需要放开注释
yum remove -y kubelet kubeadm kubectl

# 由于版本更新频繁,这里指定版本号部署
## 安装kubelet、kubeadm、kubectl
## 将 $1 替换为 kubernetes 版本号,例如 1.19.3
## yum install -y kubelet-$1 kubeadm-$1 kubectl-$1
yum install -y kubelet-1.19.3kubeadm-1.19.3kubectl-1.19.3


# 重启 docker,并启动 kubelet
systemctl daemon-reload
systemctl restart docker
systemctl enable kubelet & & systemctl start kubelet


# 打印分割线
echo "====================="

# 打印docker版本信息
docker version

# 挂载docker 目录
systemctl stop docker
cp -R /var/lib/docker/* /home/docker/
mkdir -p /etc/systemd/system/docker.service.d

cat > /etc/systemd/system/docker.service.d/devicemapper.conf < < EOF
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --graph=/home/docker
EOF
systemctl daemon-reload
systemctl restart docker
systemctl enable docker


###############################################
# 从国内下载 master 节点所需镜像,并对镜像重命名
# src_registry="registry.aliyuncs.com/google_containers"
src_registry="registry.cn-beijing.aliyuncs.com/google_registry"

# 定义镜像集合数组
# 具体版本信息根据 kubeadm config images list --kubernetes-version v1.19.3 得到的
images=(
kube-apiserver:v1.19.3
kube-controller-manager:v1.19.3
kube-scheduler:v1.19.3
kube-proxy:v1.19.3
pause:3.2
etcd:3.4.13-0
coredns:1.7.0
)
# 循环从国内获取的Docker镜像
for img in $images[@];
do
# 从国内源下载镜像
docker pull $src_registry/$img
# 改变镜像名称
docker tag$src_registry/$img k8s.gcr.io/$img
# 删除源始镜像
docker rmi$src_registry/$img
# 打印分割线
echo "======== $img download OK========"
done
echo "********** k8s master docker images pull OK! **********"


对应节点打开备注,这个脚本每个节点都需要修改
下面这个是harbor仓库地址


http://hub-mirror.c.163.com 是国内镜像仓库地址出现镜像下载失败可以选择更换仓库地址或者更换镜像版本之后
用  docker  pull  的方式重试  docker pull    coredns:1.7.0
images=(
    kube-proxy:v1.19.3
    pause:3.2
)
node节点只需要这两个镜像,master节点需要所有的镜像,但是都下载下来没有关系
?先确定镜像有没有下载成功?
docker images



缺镜像的话请手动pull  镜像,镜像版本请下载自己需要的
master节点都需要
docker pullkube-apiserver:v1.19.3
docker pullkube-controller-manager:v1.19.3
docker pullkube-scheduler:v1.19.3
docker pullkube-proxy:v1.19.3
docker pullpause:3.2
docker pulletcd:3.4.13-0
docker pullcoredns:1.7.0

node节点
docker pullkube-proxy:v1.19.3
docker pullpause:3.2



3.修改master脚本
#!/bin/bash

##### 在 k8s master 节点执行

# 加载环境变量
. /etc/profile
. /etc/bashrc

# kubeadm 初始化
##### 初始化方式1
# 这个初始化过程需要几分钟,具体时间取决于你的网络。
# --apiserver-advertise-address=x.x.x.x 本机内网地址 ★★★★★ 「你需要修改处」
# --service-cidr=x.x.x.x 为服务VIP使用可选的IP地址范围。默认10.96.0.0/12
# --pod-network-cidr=x.x.x.x指定pod网络的IP地址范围。
kubeadm init \\
--apiserver-advertise-address=192.168.22.1\\
--kubernetes-version v1.19.3 \\
--service-cidr=10.96.0.0/12 \\
--pod-network-cidr=10.244.0.0/16

##### 初始化方式2 【推荐方式】
# --upload-certs 自动颁发证书,高可用有意义,单机可选
# kubeadm-config.yaml文件,通过上文已得到该文件
#kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
echo "********** kubeadm init OK! **********"


# 配置 kubectl
mkdir -p $HOME/.kube/
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
echo "********** kubectl config OK! **********"


###############################################
# Kubernetes CNI扁平化网络:Flannel、Calico、Canal和Weave
# https://blog.csdn.net/RancherLabs/article/details/88885539
# 安装 kube-flannel 网络
# 若能够访问到quay.io这个registery,可以注释掉下面3行docker命令。 在 kube-flannel.yml 文件中可得到 flannel 版本信息
# 如果不能访问 quay.io这个registery,那么请使用下面3行
#docker pull $src_registry/flannel:v0.12.0-amd64
#docker tag$src_registry/flannel:v0.12.0-amd64 quay.io/coreos/flannel:v0.12.0-amd64
#docker rmi$src_registry/flannel:v0.12.0-amd64
# 如果下载失败,那么可通过 https://github.com/coreos/flannel/blob/v0.12.0/Documentation/kube-flannel.yml 页面拷贝到本地
#wget https://raw.githubusercontent.com/coreos/flannel/v0.12.0/Documentation/kube-flannel.yml
#kubectl apply -f kube-flannel.yml
kubectl apply -f calico.yaml
echo "********** kube-calico network OK! **********"


###############################################
# master节点验证所有pod状态
echo "********** kubectl get pods --all-namespaces -o wide **********"
# kubectl get pods -A -o wide# 与下面的命令等效
kubectl get pods --all-namespaces -o wide

# master节点查看node状态
echo "********** kubectl get nodes **********"
kubectl get nodes

echo "********** 获得 join 命令参数 **********"
kubeadm token create --print-join-command
————————————————
#k8s 命令自动补全
yuminstall -y bash-completion
#locate bash_completion /usr/share/bash-completion/bash_completion
source /usr/share/bash-completion/bash_completion
source < (kubectl completion bash)
————————————————

#备注:安装完成后,在master节点执行kubectl get po -A -o wide
#ping 10.244.235.195 (master节点上的pod的IP),查看是否ping的通
#查看service: kubectl getsvc-n kube-system
#ping CLUSTER-IP 查看是否ping的通,
#如果svc ip地址 ping 不通,修改kube-system 下的configmap(kube-proxy)
#...
#kind: KubeProxyConfiguration
#metricsBindAddress: ""
#mode: "ipvs"#将mode的值修改为ipvs
#nodePortAddresses: null
#oomScoreAdj: null
#portRange: ""
#showHiddenMetricsForVersion: ""
#...

修改ip

修改对应的ip为master节点ip
master节点执行
kubeadm token create --print-join-command

将输出结果复制到各个node节点

kubeadm join 192.168.55.11:6443 --token n8tku3.caf85w7jaewyi5gl--discovery-token-ca-cert-hash sha256:895a6b14b1304f52534e29481fcce265bde999ec69ba118590586f4d83ae64ee

4.检查集群是否安装成功
kubectl get nodes


kubectl get po -A -o wide



    推荐阅读