k8s集群安装(kubeadm)
1、环境准备(master和node节点都执行)
这是一个新建的虚拟机环境,需要做以下操作。linux是centos7.6
1.1、替换yum源
把默认的yum源更换成淘宝的yum源
#删除之前的仓库地址
mkdir /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak
#查看平台yum仓库
yum repolist
#下载淘宝的repo镜像仓库地址
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
如果你修改了 任何 repo 文件,记得清除 YUM 的缓存并重新构建缓存
sudo yum clean all && sudo yum makecache
#或者执行
yum clean all && yum makecache && yum repolist
1.2、关闭selinux
#查看selinux状态
sestatus
永久关闭selinux,修改配置文件/etc/selinux/config,将SELINUX=enforcing改为SELINUX=disabled,使用重启命令sudo reboot 配置生效
vi /etc/selinux/config
临时关闭SELinux,但此方法在重启后会是失效。
sudo setenforce 0
1.3、永久关闭防火墙
#查看防火墙状态
sudo systemctl status firewalld
#停止firewalld服务 && #禁止firewalld服务在系统启动时自动启动
sudo systemctl stop firewalld && sudo systemctl disable firewalld
1.4、永久关闭swap
查看是否关闭swap, 如下,执行free -h 如果Swap行不为0,说明swap是开着的,为0是关着的。
[root@bogon ~]# free -h
total used free shared buff/cache available
Mem: 1.8G 126M 1.5G 9.5M 161M 1.5G
Swap: 2.0G 0B 2.0G
永久关闭swap:
编辑 /etc/fstab文件,找到带有swap行,然后注释该行,重启机器后生效。
vi /etc/fstab
临时关闭swap,重启失效:
swapoff -a
1.5、修改主机名添加host
#查看主机的hostname
hostname
#修改hostname为k8s-master1
sudo hostnamectl set-hostname k8s-master1
添加host, 记得后面把node节点的host也配置上。
vi /etc/hosts
192.168.8.132 k8s-master1
192.168.8.133 k8s-node1
192.168.8.134 k8s-node2
1.6、时间同步
sudo yum -y install ntpdate
1.7、将桥接的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
1.8、docker安装
配置docker的yum源
yum install wget -y
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -P /etc/yum.repos.d/
#清空yum缓存
yum clean all && yum makecache && yum repolist
#查看docker可以安装的版本
yum list docker-ce --showduplicates | sort -
#安装docker
yum install docker-ce-23.0.6 -y
# 启动docker
systemctl start docker
# 开机自启
systemctl enable docker
# 查看启动状态
systemctl status docker
#查看版本
docker -v
#重启
systemctl daemon-reload && systemctl restart docker
配置docker国内仓库地址
顺便加上"exec-opts": [“native.cgroupdriver=systemd”],防止后面搭建k8s集群报错
vi /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://noohub.ru",
"https://huecker.io",
"https://dockerhub.timeweb.cloud",
"https://docker.rainbond.cc"
],
"exec-opts": ["native.cgroupdriver=systemd"]
}
1.9、设置k8s yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 Kubernetes源设为阿里
gpgcheck=0:表示对从这个源下载的rpm包不进行校验
repo_gpgcheck=0:某些安全性配置文件会在 /etc/yum.conf 内全面启用 repo_gpgcheck,以便能检验软件库的中继数据的加密签署
如果gpgcheck设为1,会进行校验,就会报错如下,所以这里设为0
2.0、安装kubelet,kubeadm,kubectl
yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
systemctl enable kubelet
2、master节点(master节点执行)
#查看k8s版本
kubeadm version
#查看初始化需要哪些镜像
kubeadm config images list
#查看kubelet状态
systemctl status kubelet
可以先通过kubeadm config images pull手动在各个节点上拉取所k8s需要的docker镜像,master节点初始化或者node节点加入集群时,会用到这些镜像
如果不先执行kubeadm config images pull拉取镜像,其实在master节点执行kubeadm init 或者node节点执行 kubeadm join命令时,也会先拉取镜像。
本人没有提前拉取镜像,都是在master节点kubeadm init 和node节点 kubeadm join时,自动拉的镜像。
注意 : apiserver-advertise-address指的是master的主机IP
kubeadm init --kubernetes-version=v1.23.6 \
--apiserver-advertise-address=192.168.8.132 \
--image-repository=registry.aliyuncs.com/google_containers \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
初始化遇到错误,排查错误。
用命令journalctl -xefu kubelet查看错误日志
journalctl -xefu kubelet
上面错误是因为kubelet的cgroup和docker的不一致所导致的,“kubelet cgroup驱动为systemd,而docker的为cgroupfs”,解决方式修改docker的cgroup为systemd。(环境准备时已经加上了)
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://noohub.ru",
"https://huecker.io",
"https://dockerhub.timeweb.cloud",
"https://docker.rainbond.cc"
],
"exec-opts": ["native.cgroupdriver=systemd"]
}
然后重启kubelet
systemctl restart kubelet
systemctl status kubelet
journalctl -xefu kubelet
再次查看,发现报没认证信息,不用管,
重新重置下,重新init
kubeadm reset
kubeadm init --kubernetes-version=v1.23.6 \
--apiserver-advertise-address=192.168.8.132 \
--image-repository=registry.aliyuncs.com/google_containers \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
执行下面三条命令。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3、加入node节点(具体在哪个节点执行,下面备注有)
查看token,node加入集群需要该token。
TTL表示token过期时间,如果过期了,使用create重新创建下token就行。
(master节点执行)
#如果查不出来,表示token过期,需要重新创建。
kubeadm token list
#重新创建token
kubeadm token create
[root@k8s-master1 ~] kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
u3ht6s.l91gbx6rkqrkkktj 23h 2024-11-10T08:04:30Z authentication,signing <none> system:bootstrappers:kubeadm:default-node-token
用openssl生成sha值
(master节点执行)
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
生成hash 格式:f0e9a247c9382fd88327335d616725d59f37f02941676ff029c413611f8112df
(node节点执行)
加入集群命令(在node节点执行)
记得hash 后需要手动加上sha256
kubeadm join 192.168.8.132:6443 --token y2fexv.1wtmar0g1kg42yyw \
--discovery-token-ca-cert-hash sha256:f0e9a247c9382fd88327335d616725d59f37f02941676ff029c413611f8112df
查看k8s各个节点状态,发现节点都是nodeready状态,各个组件状态正常。
(master节点执行)
#查看节点状态
kubectl get node
#查看各个组件状态,比如etcd,scheduler,controller-manager
kubectl get cs
#查看各个pod状态,发现crons没起来,可能是因为网络插件还没装.
kubectl get pod -n kube-system
安装网络插件
(master节点执行)
curl https://docs.projectcalico.org/manifests/calico.yaml -O
#修改calico.yaml中的CALICO_IPV4POOL_CIDR(默认是注释的),注意要配置为k8s集群的pod网段。
#查看网络需要下载的镜像
grep image calico.yaml
#修改网络下载镜像的默认地址为空,则默认使用docker的仓库地址
sed -i 's#docker.io/##g' calico.yaml
启动网络插件:
(master节点执行)
kubectl apply -f calico.yaml
然后继续查看网络的pod是否起来了
(master节点执行)
kubectl get pod -n kube-system
如果pod一直起不来,则使用describe 命令查看日志状态。
(master节点执行)
kubectl describe pod pod名称 -n kube-system
如果报错日志是镜像拉不下来,则手动去master和node节点都拉下镜像
(master和node节点执行)
docker pull calico/kube-controllers:v3.25.0
docker pull calico/cni:v3.25.0
docker pull calico/node:v3.25.0
然后发现网络插件都启动正常,节点也都是ready状态,此时就搭建集群成功了,如果需要加入其他node节点,重复上面操作即可。
4、创建nginx当测试
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
查看放开的端口:
[root@k8s-master1 opt]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 28h
nginx NodePort 10.102.104.249 <none> 80:30940/TCP 6m10s
通master或者node节点的ip+端口访问即可:
http://192.168.8.132:30940/
http://192.168.8.133:30940/
5、在任意节点使用kubectl
master节点执行,拷贝到需要kubectl命令的节点
scp /etc/kubernetes/admin.conf root@k8s-node1:/etc/kubernetes
对应的node节点执行
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile