kuadm搭建K8S集群
1.K8s 采用Kubeadm搭建
- Kubeadm 是 Kubernetes 官方提供的快速安装和初始化 Kubernetes 集群的工具
- 阅读以下各组件与对象作用
https://kubernetes.io/docs/concepts/
https://kubernetes.io/docs/setup/independent/install-kubeadm/
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
1.1环境要求
环境 | 硬件 |
---|---|
centos7.6 | CPU:2G 内存:2G |
1.2环境角色
ip | 角色 | 安装软件 |
---|---|---|
10.0.0.134 | k8s-Master | kube-apiserver kube-schduler kube-controller-manager docker flannel kubelet |
10.0.0.135 | k8s-node01 | kubelet kube-proxy docker flannel |
1.3环境初始化
- 所有机器关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
- 所有机器关闭selinux
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config && setenforce 0
- 关闭swap分区
# 临时关闭
swapoff -a
# 永久关闭
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
echo "vm.swappiness = 0">> /etc/sysctl.conf
sysctl -p
- 设置本机host
# master节点运行如下
hostnamectl set-hostname k8s-master
# node01节点运行如下
hostnamectl set-hostname k8s-node01
# 刷新
bash
- master机器
/etc/hosts
添加dnfs映射
cat >> /etc/hosts << EOF
10.0.0.137 k8s-master
10.0.0.138 k8s-node01
10.0.0.139 k8s-node02
EOF
- 将桥接的IPv4流量传递到iptables的链
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
EOF
sysctl --system
- 配置软件源
cd /etc/yum.repos.d
mv CentOS-Base.repo CentOS-Base.repo.bak
mv epel.repo epel.repo.bak
curl https://mirrors.aliyun.com/repo/Centos-7.repo -o CentOS-Base.repo
sed -i 's/gpgcheck=1/gpgcheck=0/g' /etc/yum.repos.d/CentOS-Base.repo
curl https://mirrors.aliyun.com/repo/epel-7.repo -o epel.repo
- 配置配置kubernetes源为阿里的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
- 更新缓存
yum clean all && yum makecache && yum repolist
- 时间同步
yum install ntpdate -y
ntpdate time.windows.com
1.4 安装docker
-
安装gcc
yum -y install gcc yum -y install gcc-c++
-
卸载旧的版本
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
-
安装需要软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
-
master 和 node 安装docker
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-18.06.1.ce-3.el7
- yum 镜像加速
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors":["https://4b6uops9.mirror.aliyuncs.com"]
}
EOF
- master 和 node 节点启动docker 。 并设置开机自启动
systemctl enable docker && systemctl start docker
- 检查
docker --version
1.5安装 kubeadm,kubelet和kubectl
- 这里拉取是1.15版本
yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0
1.Kubelet: 负责与其他节点集群通信,并进行本节点Pod和容器生命周期管理
2.Kubeadm是Kubernetes的自动化部署工具,降低了部署难度,提高效率
3.Kubectl是Kubernetes集群管理工具
- 启动kubelet
systemctl enable kubelet --now
- 查看一下kubeadm版本
kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.0", GitCommit:"cb303e613a121a29364f75cc67d3d580833a7479", GitTreeState:"clean", BuildDate:"2021-04-08T16:30:03Z", GoVersion:"go1.16.1", Compiler:"gc", Platform:"linux/amd64"}
1.6K8s Master部署
kubeadm init \
--apiserver-advertise-address=10.0.0.134 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.15.0 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
# 这里apiserve=10.0.0.134 是master节点ip
#master节点部署1.20.0
kubeadm init \
--apiserver-advertise-address=10.0.0.137 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.20.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
# kubeadm init 创建master节点
# --apiserver-advertise-address 与node节点通信ip
# --image-repository 指定镜像仓库
# --kubernetes-version k8s的版本
# --service-cidr service网段 暴露pod虚拟ip的网段
# --pod-network-cidr pod配置的ip网段
# --ignore-preflight-errors 忽略与检查错误
# 这里apiserve=10.0.0.137 是master节点ip
-
kubeadm init 这里首先【preflight】做了下环境检查,检查完毕后从配置仓库地址拉取镜像,然后【certs】创建证书目录
/etc/kubernetes/pki/
,并生成证书。然后【kubeconfig】创建连接apiserver的配置文件目录在/etc/kubernetes
, 【kube-start】生成kubelet配置文件并且启动, 【control-plane】 使用静态pod启动master组件/etc/kubernetes/mainfests
, 【upload-config】,【upload-certs】,【kubelet 】使用ConfigMap存储kubelet配置。 【mark-control-planne】 给master节点添加标签。通过【bootstrap-token 】kubelet自动申请证书,【addons】安装插件CoreDNS和kube-proxy
-
由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。
-
根据输出提示操作:
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
1.7 K8s Node节点注册Master
上面根据输出提示输入指令会生成如下内容
kubeadm join 10.0.0.137:6443 --token s6y5ca.7z7v11jhxlp8xvin \
--discovery-token-ca-cert-hash sha256:ad471efbaa32a0246099031e7439bee4e1b0ac29a811ada3d838c9b014e49460
# node执行即可
默认token的有效期为24小时,当过期之后,该token就不可用了
- 如果提示错误:
[kubeadm 报错 error execution phase preflight: couldn’t validate the identity of the API Server: abort connecting to API ...
# 在master重新生成token
[root@k8s-master ~]# kubeadm token create
4fa1sg.rtmdm0zvaz9xgvgi
[root@k8s-master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
ad471efbaa32a0246099031e7439bee4e1b0ac29a811ada3d838c9b014e49460
# node节点加入集群
kubeadm join 10.0.0.137:6443 --token 4fa1sg.rtmdm0zvaz9xgvgi \
--discovery-token-ca-cert-hash sha256:ad471efbaa32a0246099031e7439bee4e1b0ac29a811ada3d838c9b014e49460
- 后续有nodes节点加入,解决方法如下: 步骤:
# 0.重新生成新的token
kubeadm token create
# 1.master节点查看token:
kubeadm token list
TOKEN v2t93e.t8fnw16slsjtj5jc# 记住它
TTL 23h
EXPIRES 2021-04-16T15:10:11+08:00
USAGES authentication,signing
DESCRIPTION The default bootstrap token generated by 'kubeadm init'. EXTRA GROUPS system:bootstrappers:kubeadm:default-node-token
# 2.master节点生成密钥
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
# 此时会生成: 4fa53fd3b654db36c930152dd71704c1da8707f217a63801caebbb1a0af86022
# 3.node节点加入集群 10.0.0.134 为Master节点
# 先清理环境:
kubeadm reset
# 加入:
kubeadm join 10.0.0.134:6443 --token j3dhvb.oowj54et7l1tsruv --discovery-token-ca-cert-hash sha256:4fa53fd3b654db36c930152dd71704c1da8707f217a63801caebbb1a0af86022
-
这里记录几个node加入节点错误:
-
错误1:
[ERROR Swap]: running with swap on is not supported. Please disable swap
# 关闭swapoff swapoff -a # 注释配置 vi /etc/fstab # 注释掉 /dev/mapper/centos-swap # 重启 init 6
-
错误2:
error execution phase preflight: couldn't validate the identity of the API Server: encoding/hex: odd length hex string
# master重新生成密钥即可 openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
-
错误3:
[ERROR FileAvailable--etc-kubernetes-kubelet.conf]: ``/etc/kubernetes/kubelet``.conf already exists
rm -f /etc/kubernetes/kubelet.conf rm -f /etc/kubernetes/pki/ca.crt # 然后重新join
-
-
master节点查看加入节点信息
kubectl get nodes
1.8安装网络插件
-
这里在master执行, 获取kube-flannel.yml
wget https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
-
这里需要编辑
kube-flannel.yml
文件,原因是国内有可能访问不了quay.io
这个registeryvim kube-flannel.yml
修改106 120行内容
-
master
加载kube-flannel.yml
文件配置:kubectl apply -f kube-flannel.yml
-
master
查看flannel
执行状态[root@k8s-master ~]# ps -ef|grep flannel root 26595 26580 1 16:07 ? 00:00:00 /opt/bin/flanneld --ip-masq --kube-subnet-mgr
-
节点信息查看
kubectl get nodes# 节点查看 kubectl get pod -n kube-system# 运行状态查看
-
如果在执行
kubectl get pod -n kube-system
所有执行状态为1/1
方位正常,如果存在0/1
情况,应该如下重复操作# 删除加载kube-flannel.yml kubectl delete -f kube-flannel.yml # 重新wget, 修改镜像配置 # 执行 kubectl apply -f kube-flannel.yml
1.9 验证
-
master
新增一个pod, 对外暴漏80 端口# 创建pod kubectl create deployment nginx --image=nginx # nginx暴漏80 kubectl expose deployment nginx --port=80 --type=NodePort #
-
查看
pods
和service
[root@k8s-master ~]# kubectl get pods,svc NAME READY STATUS RESTARTS AGE pod/nginx-554b9c67f9-vrjcf 0/1 ContainerCreating 0 57s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 63m service/nginx NodePort 10.1.23.175 <none> 80:31459/TCP 27s
-
访问
http://10.0.0.134:31459/
,显示如下成功:
1.10 Dashboard 可视化
-
获取
kubernetes-dashboard.yaml
配置文件wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
-
修改:
改为:lizhenliang/kubernetes-dashboard-amd64:v1.10.1
- 新增:
master
执行:
kubectl apply -f kubernetes-dashboard.yaml
- 访问
http://10.0.0.134:30001/
,显示如下成功: 谷歌因为受信任问题无法访问,用火狐访问
- 创建
service account
并绑定默认cluster-admin
管理员集群角色
kubectl create serviceaccount cluster-admin -n kube-system
# 名字叫cluster-admin
- 将创建账号进行权限绑定
kubectl create clusterrolebinding cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:cluster-admin
# cluster-admin 具有超级管理员的权限
- 这里使用token认证,我们执行命令拿去token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/cluster-admin/{print $1}')
- 令牌登录
- 其他操作:删除签名
kubectl delete clusterrolebindings cluster-admin
- 其他浏览器访问不受信任问题解决
[root@k8s-master ~]# cd /etc/kubernetes/pki/
[root@k8s-master pki]# mkdir ui
[root@k8s-master pki]# cp apiserver.crt ui/
[root@k8s-master pki]# cp apiserver.key ui/
[root@k8s-master pki]# cd ui/
[root@k8s-master ui]# mv apiserver.crt dashboard.pem
[root@k8s-master ui]# mv apiserver.key dashboard-key.pem
[root@k8s-master ui]# kubectl delete secret kubernetes-dashboard-certs -n kube-system
[root@k8s-master ui]# kubectl create secret generic kubernetes-dashboard-certs --from-file=./ -n kube-system
[root@k8s-master]# vim kubernetes-dashboard.yaml #回到这个yaml的路径下修改
修改 dashboard-controller.yaml 文件,在args下面增加证书两行
- --tls-key-file=dashboard-key.pem
- --tls-cert-file=dashboard.pem
[root@k8s-master ~]kubectl apply -f kubernetes-dashboard.yaml
[root@k8s-master ~]# kubectl create serviceaccount dashboard-admin -n kube-system
serviceaccount/dashboard-admin created
[root@k8s-master ~]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin
--serviceaccount=kube-system:dashboard-admin
[root@k8s-master ~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
Name:
- 彻底卸载kubeadm
#!/bin/bash
kubeadm reset -f
modprobe -r ipip
lsmod
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.service
rm -rf /usr/bin/kube*
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd
yum -y remove kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库