1 准备工作
三台虚拟机,使用 NAT 网络模式,每台机器 CPU 4 C 、内存 4 GB 、磁盘 100 GB 。
固定三台机器的节点 ip ,防止 DHCP 动态分配虚拟机 ip ,否则虚拟机每次重启节点 ip 都会改变,改变之后集群的信息就会失效,所以我们选择直接固定虚机的 ip。
记住网段,之后你的固定虚机 ip 需要在这个网段内,另外子网掩码、网关也要记下来。
接着,在每台虚机中更新如下文件:
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static" // 这里很重要,把 dhcp 改成 static, 避免 dhcp 搞你的虚机
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="845739a2-6b56-4d73-aacf-236cfddec26e"
DEVICE="ens33"
ONBOOT="yes"
# 追加以下内容
IPADDR="192.168.160.10" // 设置网段内你想要的 ip
GATEWAY="192.168.160.2" // 填写网关
NETMASK="255.255.255.0" // 填写掩码
# 以下可以直接照抄
DNS1="8.8.8.8" // 谷歌免费 DSN
DNS2="253.5.5.5" // 阿里免费 DNS
然后,把上面图中我用红圈圈出来的选项取消掉,其实不搞也行,关键是配置文件里改了就行了,最后呢,就重启网络就可以了:
systemctl restart network
2 关闭一些有冲突的 Linux 组件
2.1 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
2.2 关闭 selinux
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config && setenforce 0
2.3 关闭 swap 分区
swapoff -a
sed -i '/swap/s/^/#/g' /etc/fstab
2.4 分别设置三台机器的 hostname,并修改 /etc/hosts 文件
hostnamectl set-hostname ltxisthegodofme
cat >> /etc/hosts << EOF
{master ip} master1
{worker1 ip} worker1
{worker2 ip} worker2
EOF
2.5 将桥接的流量转到 iptables
cat >> /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
2.6 同步三台机器的时区
yum install -y ntpdate
ntpdate time.windows.com
3 安装 docker
3.1 获取阿里 docker yum 源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
3.2 安装 docker
yum -y install docker-ce
3.3 启动 docker
systemctl enable docker && systemctl start docker
4 部署 k8s
4.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
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
4.2 安装kubeadm、kubelet、kubectl ,建议使用 1.21.0 版本
yum install -y kubelet-1.21.0 kubeadm-1.21.0 kubectl-1.21.0
systemctl enable kubelet
初始化之前需要在所有节点先下载 coredns 镜像,否则会初始化失败
kubeadm init --apiserver-advertise-address=192.168.160.145 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.21.0 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16
failed to pull image registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0: output: Error r
原因:拉 coredns 镜像时要访问 google,你没技术翻墙,所以失败了
解决办法:根据报错信息拉去最新镜像并重新打 tag 或者马上放弃 k8s 的学习
docker pull coredns/coredns
docker tag coredns/coredns:latest registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
4.3 使用 kubeadm 初始化 master 节点
kubeadm init \
--apiserver-advertise-address={master 节点的 ip} \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.1.0.0/16 \
--kubernetes-version=1.21.1 \
--pod-network-cidr=10.244.0.0/16
4.4 复制 kubeconfig 文件并获取其使用权
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4.5 直接使用初始化的提示结果在两台 worker 节点执行命令加入 master 节点
、4.6 由于 master 初始化生成的 token 只有 24 小时有效期,后续如果还有新节点想 要加入集群的话,需要在 master 节点生成新的 token
kubeadm token create --print-join-command
4.6.1 也可以生产永不过期的 token
kubeadm token create --ttl 0
4.6.2 查看 token 列表
kubeadm token list
4.6.3 获取ca证书sha256编码hash值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
4.6.4 使用永久的 token 和 sha256 的 hash 值加入 master(在两台 worker 节点执行)
kubeadm join {master 的 ip 地址}:6443 --token {未过期的 token} --discovery-token-ca-cert-hash sha256:{sha256 hash 值}
5 安装网络查件 flannel
5.1 先配置 raw.githubusercontent.com 的 ip 域名映射,否则有墙会下载失败
cat >> /etc/hosts << EOF
185.199.111.133 raw.githubusercontent.com
EOF
5.2 下载 flannel yaml (多试几次,准能成功)
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
5.3 如果创建 flannel 失败,再替换 kube-flannel.yml 106、120 行镜像
使用国内镜像 lizhenliang/flannel:v0.11.0- amd64
5.4 创建 flannel
kubectl apply -f kube-flannel.yml
创建 flannel 之后,修复一下 coredns 的 yaml,在最后追加:
kubectl edit clusterrole system:coredns
- apiGroups:
- discovery.k8s.io
resources:
- endpointslices
verbs:
- list
- watch
6 查收快乐
6.1 查看所有节点是否全部 Ready
kubectl get nodes
6.2 查看所有 pod 是否 Ready
kubectl get pods -A
7 安装 dashboard
7.1 下载官方 dashboard yaml
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
7.2 更改 dashboard service 为 NodePort 模式
vim recommended.yaml
// 修改 dashboard 的 service 在 spec 下增加 type: NodePort 一项
// 将 RoleBinding 的 role 更改为 cluster-admin
7.3 安装
kubectl apply -f recommended.yaml
7.4 创建管理用户
#创建 dashboard-admin 账户
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
#将 dashboard-admin 用户授 luster-admin 权限(clusterrole 为集群管理权限)
kubectl create clusterrolebinding dashboard-admin-rb --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
#获取账号 token
kubectl get secrets -n kubernetes-dashboard |grep dashboard-admin
#通过账号获取 token (此处 dashboard-admin-token-xxxx 为上文获取)
kubectl describe secrets dashboard-admin-token-xxxx -n kubernetes-dashboard
#复制 token
7.5 卸载 dashboard
kubectl get secret,sa,role,rolebinding,services,deployments -n kubernetes-dashboard | grep dashboard
# 删除查询到的所有资源