下面进行k8s环境的搭建,当然我是在自己本地电脑的虚拟机搭建的,并且每个节点分配了4G的内存,我电脑共16G内存,三个节点就占据了12G,卡卡的,但是没办法,总不能用云服务器吧,不过貌似用云服务器也是可以的,按量计费,搭建完也费不了多少钱吧,练习完后就删掉即可。
讲真下面已经是我第二次搭建了,第一次搭建,虽然控制台进去了,但是在一个节点竟然不能访问另一个节点的pod,pod和service在集群中不是可以肆意的访问么?网上查可能是因为Pod CIDR与节点IP冲突,Calico的Pod CIDR即—pod-network-cidr默认使用的是192.168.0.0/16,而当集群节点的IP段也为192.168.0.0/16时,必然导致IP段冲突,由于不会在搭建好后重新修改这些配置,所以只能重新搭建了。
一、环境准备
1、相关版本
Linux: CentOS7 64位
docker:20.10.7
kubelet:1.20.9
kubeadm:1.20.9
kubectl:1.20.9
2、虚拟机准备
我是准备搭建三个节点的集群,毕竟本地虚拟机,配置比较弱,linux内存都是给的4G,已经是我能给的极限了,大家有条件的可以用8G。目前规划下面几个IP。
k8s-new-master:192.168.192.8
k8s-new-node1:192.168.192.9
k8s-new-node2:192.168.192.10
这里虚拟机的搭建可以参考我如下几篇笔记
安装VMware15
CentOS7镜像官网下载
VMWare安装CentOS7超全图解
最小系统Centos7进行网络配置以及 ifconfig和vim的安装
VMWare 克隆Linux虚拟机
3、安装好后先克隆三台机器
密码都是root/forever、内存都是4G、然后参考上面的笔记修改好对应的ip地址。弄好后最好做个快照,防止后面操作失败可以恢复快照重新来过(我就是master节点忘记设置host本身的k8s-new-master导致重新来过了)。
二、k8s集群搭建
1、先安装好docker
1-1、卸载以前的docker包,这个步骤正常新的linux不用执行
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
1-2、配置好yum源
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1-3、安装docker,我们选择固定版本
yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6
在加入节点的时候会报警告说版本不对,其实可以不用理会,如果有强迫症可以用下面的版本
yum install -y docker-ce-19.03.0 docker-ce-cli-19.03.0 containerd.io-1.4.6
如果用默认版本就用这个
sudo yum install -y docker-ce docker-ce-cli containerd.io
1-4、启动docker
systemctl enable docker --now
1-5、配置加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://970k7x82.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2、安装k8s基础环境设置
所有机器执行如下操作
各个机器设置自己的域名
hostnamectl set-hostname xxxx
我这里就设置为
hostnamectl set-hostname k8s-new-master
hostnamectl set-hostname k8s-new-node1
hostnamectl set-hostname k8s-new-node2
将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
关闭swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
关闭防火墙
systemctl stop firewalld
允许 iptables 检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
让上面的配置生效
sudo sysctl --system
3、安装kubelet、kubeadm、kubectl
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes
sudo systemctl enable --now kubelet
4、使用kubeadm引导集群
4-1、下载各个机器需要的镜像
sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done
EOF
chmod +x ./images.sh && ./images.sh
4-2、初始化主节点
所有机器添加master域名映射,以下需要修改为自己的
echo "192.168.192.8 k8s-new-master" >> /etc/hosts
下面的操作都在主节点即可
主节点初始化,只需要在主节点也就是master做即可
正常service-cidr和pod-network-cidr不建议修改,应为后面一些网络配置用的就是它,如果修改了要做相应的调整
但是我这里pod-network-cidr因为这个跟本机冲突了,所以导致ping不通pod,所以我这里改了一下,后面安装网络插件calico.yaml的时候也需要对应的修改下,pod-network-cidr的默认值为192.168.0.0/16,我改为10.244.0.0/16。(参考:https://blog.csdn.net/weixin_43757027/article/details/123577417)
kubeadm init \
--apiserver-advertise-address=192.168.192.8 \
--control-plane-endpoint=k8s-new-master \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16
要保证所有网络范围不重叠,执行完后会有一段日志,一定要拷贝下来,后面加入节点有用
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
kubeadm join k8s-new-master:6443 --token wyd5si.xujsxwbpndj7b9n1 \
--discovery-token-ca-cert-hash sha256:071c85ba8f7b184394bd3e44e54243152bbb658f1053c0a90b590631b6370cb2 \
--control-plane
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join k8s-new-master:6443 --token wyd5si.xujsxwbpndj7b9n1 \
--discovery-token-ca-cert-hash sha256:071c85ba8f7b184394bd3e44e54243152bbb658f1053c0a90b590631b6370cb2
根据上面的日志提示继续执行
4-3、设置.kube/config
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4-4、安装网络组件
若没有wget命令,可以先安装
yum install -y wget
wget https://docs.projectcalico.org/manifests/calico.yaml
然后发现网络不通,下载报错,则用这个https://www.suibibk.com//fileupload/files/calico.yaml
这里一定要修改下面逻辑
# - name: CALICO_IPV4POOL_CIDR
# value: "192.168.0.0/16"
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
ip一定要改为跟之前初始化指定的一样。
kubectl apply -f calico.yaml
4-5、加入node节点,也是用上面的日志,这里要在字节点执行
kubeadm join k8s-new-master:6443 --token wyd5si.xujsxwbpndj7b9n1 \
--discovery-token-ca-cert-hash sha256:071c85ba8f7b184394bd3e44e54243152bbb658f1053c0a90b590631b6370cb2
如果令牌不记得了,可以执行如下命令产生新令牌
kubeadm token create --print-join-command
提示如下错误
[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 20.10.7. Latest validated version: 19.03
这里要降低docker的版本(当然不降低也可以,毕竟只是警告)
如果卡住,那么需要关闭防火墙,前面的流程应该已经关闭
systemctl stop firewalld
当然最好先永久关闭,不然开机后可能有问题
systemctl disable firewalld #永久关闭,即设置开机的时候不自动启动
加入后过几分钟,在master节点就会看到
[root@k8s-new-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-new-master Ready control-plane,master 31m v1.20.9
k8s-new-node1 Ready <none> 3m22s v1.20.9
k8s-new-node2 Ready <none> 3m4s v1.20.9
4-6、如果是加入高可用的主节点,也是按日志的步骤执行下面命令即可
kubeadm join k8s-new-master:6443 --token wyd5si.xujsxwbpndj7b9n1 \
--discovery-token-ca-cert-hash sha256:071c85ba8f7b184394bd3e44e54243152bbb658f1053c0a90b590631b6370cb2 \
--control-plane
4-7、相关命令
#查看集群所有节点
kubectl get nodes
#根据配置文件,给集群创建资源
kubectl apply -f xxxx.yaml
#查看集群部署了哪些应用?
docker ps === kubectl get pods -A
# 运行中的应用在docker里面叫容器,在k8s里面叫Pod
kubectl get pods -A
5、部署dashboard
kubernetes官方提供的可视化界面
https://github.com/kubernetes/dashboard
执行如下命令就可
kubectl apply -f https://www.suibibk.com//fileupload/files/dashboard.yaml
可以下载下来再执行,里面的主节点是k8s-master,记得全部要改为自己的,我现在是k8s-new-master
查看状态
kubectl get pods -A
都running了后再继续执行
如果出错了,可以重启
kubectl replace --force -f dashboard.yaml
5-1、设置访问端口
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
type: ClusterIP 改为 type: NodePort
5-2、找到端口
kubectl get svc -A |grep kubernetes-dashboard
443:30110
云服务器需要安全组放行,防火墙放行
访问:
https://集群任意IP:端口
我这里是:https://192.168.192.8:30110
5-3、故障
完全访问不了,查看日志
#查看容器
kubectl get pods -A
#查看日志
kubectl logs kubernetes-dashboard-775688487c-fpzv8 -n kubernetes-dashboard
发现错误
Initializing csrf token from kubernetes-dashboard-csrf secret panic: Get https://10.96.0.1:443/api/v1/namespaces/kubernetes-dashboard/secrets/kubernetes-dashboard-csrf: dial tcp 10.96.0.1:443: i/o timeout
跟我遇到的一样的原因
https://blog.csdn.net/qq_44847649/article/details/123504663
https://blog.csdn.net/qq_44847649/article/details/123082308
参考解决下,解决完后,要用这个强制重新部署
kubectl replace --force -f dashboard.yaml
再查看状态就很正常了
kubectl get pods -A
重走5-1,5-2
访问,大公告成:https://192.168.192.8:30110
如果用我上面的yaml,则只需修改主节点的名字即可,不需要做其他操作,也不会遇到上面的问题。
5-4、创建访问账号
#创建访问账号,准备一个yaml文件; vi dash.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
kubectl apply -f dash.yaml
5-5、获取访问令牌
#获取访问令牌
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"
下面的是我的登录token,每个人都要用自己的
eyJhbGciOiJSUzI1NiIsImtpZCI6IkVRZGZRRm52ZlJwcWRlc040dURELTluQ1daZjV2M3o2dnBzaEhReDBZbTAifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXRqbXJwIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJmN2M3OGJkZi0xN2YzLTQxY2UtYmVhNS1lYzA0MDY4ZDgxYTQiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.tUEW6nt4KvoV48eoAShBFqGUQx4e5KHb8nB8X24JhNf9vGhAfgAKgLo1S4HEgmqPkM1FUsMxxeNZMvRvjOI7Ju9AVUQkG7bz3skd1I_yZSoiOlcc6_woCXZ0az_nOGwvjjYeE8s8TuBT0nGkiKyZBiruyjyluHJyvv_wYex4DsyGUTKytX7ab0ndSz67JdVvzsfKjOrHmvSc_93D_mWvPwuboma-22qtdH5B-OZ3LOtj-15jRdSd3B4fTsZkw8Sijjgda5ltfncYvg-MJbAq0BEOhYYzmLL5p6CfD5Nq9rnDC1NcrMQfkUu3FblekDfWasHqRvM7iEBr_G0dvuh_Pg
5-6、这里建议永久关闭下firewall
因为上面就是因为防火墙没关闭加入节点报错
systemctl disable firewalld #永久关闭,即设置开机的时候不自动启动
5-7、重启试试,重启完后执行命令
#重启
reboot
#查看节点
kubectl get nodes
#查看pod
kubectl get pods -A
访问控制台https://192.168.192.8:30110
发现都正常,至此,k8s集群搭建成功
喵的,电脑才16G内存,搭建这个集群果然有点费力
5-8、简单测试
新建一个nginx的yaml:nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: mynginx
name: mynginx
# namespace: default
spec:
containers:
- image: nginx
name: mynginx
kubectl apply -f nginx-pod.yaml
查看pod的ip
kubectl get pods -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mynginx 1/1 Running 0 2m2s 10.244.53.1 k8s-new-node2 <none> <none>
可以看到是在节点2,我们在master访问下
curl 10.244.53.1:80
发现成功啦,第二次安装由于指定了pod-network-cidr,终于没有出现问题,开心,得打个快照才行,防止后面搞kubesphere搞坏。
教程参考:
1、视频教程
https://www.bilibili.com/video/BV13Q4y1C7hS
2、笔记
https://www.yuque.com/leifengyang/oncloud/