1、安装要求
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
- 一台或多台机器,操作系统 CentOS7.x-86_x64
- 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
- 可以上网,需要拉取镜像
- 禁止swap分区
2、准备环境
k8s(微服务)
master01 192.168.0.66 zwinfo node01 192.168.0.67 zwinfo node02 192.168.0.68 zwinfo
名称 版本 docker-ce 20.10.10 docker-ce-cli 20.10.10 containerd.io 1.4.12 kubeadm 1.20.9 kubelet 1.20.9 kubectl 1.20.9 kubernetes-cni 0.8.7
openwrt(访问国外网站)
192.168.0.99
nfs(文件服务器)
192.168.0.66
系统升级
所有主机都执行
安装elrepo源
代码语言:javascript复制rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org # 导入elrepo的签名
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-5.el7.elrepo.noarch.rpm # 升级elrepo源
查看可以安装的系统内核版本
代码语言:javascript复制yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
升级系统内核
代码语言:javascript复制yum --enablerepo=elrepo-kernel install kernel-lt kernel-lt-devel -y
查看系统内核序号
代码语言:javascript复制awk -F' '$1=="menuentry " {print i " : " $2}' /etc/grub2.cfg
或者
rpm -qa kernel
选择默认系统内核
代码语言:javascript复制grub2-set-default 0
重启
代码语言:javascript复制reboot
初始化系统环境
所有主机都执行
代码语言:javascript复制# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 永久关闭selinux(重启后生效)
setenforce 0 # 临时关闭selinux(不需要重启,立即生效)
# 关闭swap
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久关闭swap(重启后生效)
swapoff -a # 临时关闭swap(不需要重启,立即生效)
# 设置主机名
hostnamectl --static set-hostname master01
#hostnamectl --static set-hostname node01
#hostnamectl --static set-hostname node02
# 在master添加hosts
cat >> /etc/hosts << EOF
192.168.0.66 master01
192.168.0.67 node01
192.168.0.68 node02
EOF
# 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system # 立即生效
# 时间同步
yum install ntpdate -y
ntpdate -u pool.ntp.org
# 添加定时
crontab -l
*/20 * * * * /sbin/ntpdate -u pool.ntp.org > /dev/null 2>&1
3、部署Docker
所有主机都执行
代码语言:javascript复制#安装wget
yum install wget -y
#下载docker-ce源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
#查看可以安装的docker版本
yum list docker-ce --showduplicates | sort -r
#安装docker
yum install -y docker-ce-20.10.10 docker-ce-cli-20.10.10 containerd.io-1.4.12
#查看docker版本
docker -v
#创建docker配置目录
mkdir /etc/docker
#配置docker源
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://anson.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"insecure-registries": ["harbor.anson.cn"]
}
EOF
#重载
systemctl daemon-reload
#设置开机启动
systemctl enable docker
#启动docker服务
systemctl start docker
4、安装kubeadm
所有主机上执行
代码语言:javascript复制#添加阿里yum源
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
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
#安装kubeadm
yum -y install kubeadm-1.23.4 kubelet-1.23.4 kubectl-1.23.4
#设置开机启动
systemctl enable kubelet
#启动kubelet服务
systemctl start kubelet
5、部署kubernetes
只在master上执行 (失败重置命令 kubeadm reset )
生成初始化文件kubeadm-config.yaml
代码语言:javascript复制kubeadm config print init-defaults > kubeadm-config.yaml
修改配置文件
代码语言:javascript复制vi kubeadm-config.yaml
修改如下注释部分
代码语言:javascript复制apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: 4jvhpu.xxxxxx# 随便设置个token,或者删除bootstrapTokens
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.0.66 # 修改为master01的ip地址
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: master01 # 修改为master01的节点名称,host保持一致
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers # 修改为阿里云镜像仓库
kind: ClusterConfiguration
kubernetesVersion: v1.20.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16 # 添加pod子网
scheduler: {}
拉取镜像
代码语言:javascript复制kubeadm config images pull --config kubeadm-config.yaml
初始化master
代码语言:javascript复制kubeadm init --config kubeadm-config.yaml
按照提示执行命令
代码语言:javascript复制mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看master是否安装成功
代码语言:javascript复制kubectl get node
6、添加node节点
所有node上执行
使用在master上生成的口令直接在node上执行
如果已经消失使用kubeadm token create --print-join-command重新生成即可
代码语言:javascript复制kubeadm join 192.168.0.66:6443 --token abcdef.01xxxx3456789abcdef
--discovery-token-ca-cert-hash sha256:92b7ba32b5f23d6d43ee8a2b7273be234dxxxxxx7dcb7adce7ff10fcd5beb4be0bc
等待一会,在master上查看node节点是否添加成功
代码语言:javascript复制kubectl get node
7、安装CNI网络
只在master上执行,这里选择使用flannel,github地址https://github.com/flannel-io/flannel
添加CNI网络
k8s并没有专门的网络模块负责网络配置,它需要用户在主机上已经配置好网络。
- 容器之间(包括同一台主机上的容器,和不同主机的容器)可以互相通信
- 容器和集群中所有的节点也能直接通信
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
等待一会,查看节点状态
代码语言:javascript复制kubectl get node
测试集群
代码语言:javascript复制#让master也可以部署应用
kubectl taint node master01 node-role.kubernetes.io/master:NoSchedule-
#部署一个测试web服务器
kubectl create deployment web --image=nginx
#暴露端口
kubectl expose deployment web --port=80 --target-port=80 --type=NodePort
#扩容
kubectl scale deployment web --replicas=3
#查看状态
kubectl get pod,svc