宿主机系统 | 集群角色 | 服务器IP | 主机名称 | 容器 |
---|---|---|---|---|
centos7.6 | master | 192.168.2.150 | ks-m1 | docker |
centos7.6 | master | 192.168.2.151 | ks-n1 | docker |
centos7.6 | master | 192.168.2.152 | ks-n2 | docker |
VMware安装Centos7并初始化网络使外部可以访问**
注意事项:请一定要看完上面这篇文章再执行下面的操作!!!
集群版本说明
docker:20.10.8
kubeadm version: 1.22.12
kubectl version: 1.22.12
kubelet version: 1.22.12
在192.168.2.150上执行如下:
hostnamectl set-hostname ks-m1 && bash
在192.168.2.151上执行如下:
hostnamectl set-hostname ks-n1 && bash
在192.168.2.152上执行如下:
hostnamectl set-hostname ks-n2 && bash
注意事项:k8s的hostname有一定的命名规则,一般采用小写+横线(-),比如:k8s-test-m1-01,不能使用下划线(_),比如k8s_node_1。
依次在192.168.2.150,192.168.2.151,192.168.2.152三台机器执行如下命令
cat >> /etc/hosts << EOF
192.168.2.150 ks-m1
192.168.2.151 ks-n1
192.168.2.152 ks-n2
EOF
依次在192.168.2.150,192.168.2.151,192.168.2.152三台机器执行如下命令
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/enforcing/disabled/' /etc/selinux/config
注:重启机器后,selinux配置才能永久生效
sed -ri 's/.*swap.*/#&/' /etc/fstab
注:重启机器后,才能永久生效
依次在192.168.2.150,192.168.2.151,192.168.2.152三台机器执行如下命令
升级内核十分重要,低版本的内核下k8s集群不稳定,且对插件的兼容性不好,例如3.10版本的内核不支持网络插件Calico3.23版本等。
共有两种开机引导模式:bios和uefi,其中uefi引导模式下需要关闭安全引导,否则无法正常开机。
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm -y
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
yum --enablerepo=elrepo-kernel install kernel-lt -y
kernel-ml中的ml是英文【 mainline stable 】的缩写,elrepo-kernel中罗列出来的是最新的稳定主线版本。
kernel-lt 中的lt是英文【 long term support 】的缩写,elrepo-kernel中罗列出来的长期支持版本。(推荐)
grub2-set-default 0
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
reboot
使用uname -r查看内核版本是否升级成功
uname -r
###修改升级后的内核参数
加载br_netfilter模块
modprobe br_netfilter
验证模块是否加载成功
lsmod | grep br_netfilter
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
sysctl --system
net.bridge.bridge-nf-call-iptables:开启桥设备内核监控(ipv4)
net.ipv4.ip_forward:开启路由转发
net.bridge.bridge-nf-call-ip6tables:开启桥设备内核监控(ipv6)
以上3项为必须参数,其他参数可根据需要添加。
yum clean all && yum makecache && yum repolist
yum install -y vim net-tools bash-completion wget lrzsz
yum -y install yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
cat <<EOF > /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
EOF
安装chronyd
yum install -y chronyd
启动chronyd及加入开机自启
systemctl start chronyd && systemctl enable chronyd
修改/etc/chrony.conf配置文件,同步服务器地址为阿里云,增加一行(server ntp1.aliyun.com iburst,其余服务地址注释了)
server ntp1.aliyun.com iburst
安装依赖
yum install -y ipvsadm ipset sysstat conntrack libseccomp
修改配置文件
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack ip_tables ip_set xt_set ipt_set ipt_rpfilter ipt_REJECT ipip "
for kernel_module in \${ipvs_modules}; do
/sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1
if [ $? -eq 0 ]; then
/sbin/modprobe \${kernel_module}
fi
done
EOF
给权限
chmod 755 /etc/sysconfig/modules/ipvs.modules
执行
sh /etc/sysconfig/modules/ipvs.modules
查询是否生效
lsmod | grep ip_vs
yum install docker-ce-20.10.8 docker-ce-cli-20.10.8 containerd.io -y
systemctl start docker && systemctl enable docker.service && systemctl status docker
vim /etc/docker/daemon.json
加入以下内容
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
参数说明:
修改docker文件驱动为systemd,默认为cgroupfs,kubelet默认使用systemd,两者必须一致才可以。
systemctl daemon-reload
systemctl restart docker
查看是否生效
docker info |grep Cgroup
yum install -y kubelet-1.22.12 kubeadm-1.22.12 kubectl-1.22.12
启用
systemctl enable kubelet && systemctl start kubelet && systemctl status kubelet
让命令可用自动table键进行补全,对新手无法记住命令提供很好的支持,所在主机进行该操作方可使用table补全。
Kubectl命令补全:
kubectl completion bash > /etc/bash_completion.d/kubelet
Kubeadm命令补全:
kubeadm completion bash > /etc/bash_completion.d/kubeadm
注:只在k8s-m1上执行
检测主机环境是否达到集群的要求,可根据结果提示进行逐一排除故障
kubeadm init --dry-run
列出需要使用的镜像列表
kubeadm config images list
kubeadm config images pull \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.22.12
kubeadm config print init-defaults > kubeadm-init.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.2.150 #本机ks-m1的ip
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
imagePullPolicy: IfNotPresent
name: ks-m1
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master #节点角色master
---
apiServer:
timeoutForControlPlane: 4m0s
certSANs:
- "172.17.0.252"
extraArgs:
authorization-mode: "Node,RBAC"
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
#controlPlaneEndpoint: 10.0.0.1:6443 #api server负载均衡IP配置(可选)
clusterName: kubernetes
cgroupDriver: systemd
controllerManager: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.22.12
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 10.10.0.0/16
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
kubeadm init --config kubeadm-init.yaml --upload-certs
注:upload-certs 标志用来将在所有控制平面实例之间的共享证书上传到集群,若是不加会报错.
根据初始化成功后的提示对集群进行基础的配置
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
echo "KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bashrc && source ~/.bashrc
可通过上一步生成的join串加入
依次在ks-n1,ks-n2执行
kubeadm join *****:6443 --token pa6691.w9a5ucqewqeqwih8p4e8y2g --discovery-token-ca-cert-hash sha256:cac5dc7e6c559e129bed3aeff757e3ba6da35ewqeqwec4b2734c4833d978c4c1859d5d8
master查看集群状态:
kubectl get nodes
通过查看集群状态可以看到,状态为NotReady,是因为还未安装网络插件,安装网络插件后就正常了,且node的点的角色为空,就表示这个节点是工作节点。
将ks-n1的ROLES变成work:
kubectl label node ks-n1 node-role.kubernetes.io/worker=worker
将ks-n2的ROLES变成work:
kubectl label node ks-n2 node-role.kubernetes.io/worker=worker
curl https://projectcalico.docs.tigera.io/archive/v3.22/manifests/calico.yaml -O
进入vim编辑模式,按/CLUSTER_TYPE 搜索文件内容,找到下面的位置并新增两行配置
- name: IP_AUTODETECTION_METHOD
value: "interface=ens33"
更改CALICO_IPV4POOL_IPIP的value为off
注意:在安装calico网络时,默认安装是IPIP网络。calico.yaml文件中,将CALICO_IPV4POOL_IPIP的值修改成 “off”,就能够替换成BGP网络。ens33是根据自己机器的网络来调整的。这样可以避很多calico网络错误。
提前下载Calico镜像
grep image calico.yaml
docker pull calico/kube-controllers:v3.22.5
docker pull calico/cni:v3.22.5
docker pull calico/pod2daemon-flexvol:v3.22.5
docker pull calico/node:v3.22.5
kubectl apply -f calico.yaml
查看node节点和pod状态:
kubectl get nodes
kubectl get pods -n kube-system