kubeadm 十分钟部署 k8s 集群

发布于:2023-01-04 ⋅ 阅读:(501) ⋅ 点赞:(0)

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
# 删除查询到的所有资源