k8s集群环境搭建完全版

下面进行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 <

让上面的配置生效

sudo sysctl --system

3、安装kubelet、kubeadm、kubectl

cat <
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                     3m22s   v1.20.9
k8s-new-node2    Ready                     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              

可以看到是在节点2,我们在master访问下

curl 10.244.53.1:80

发现成功啦,第二次安装由于指定了pod-network-cidr,终于没有出现问题,开心,得打个快照才行,防止后面搞kubesphere搞坏。

页面更新:2024-05-01

标签:集群   令牌   快照   节点   虚拟机   命令   内存   版本   环境   日志   网络

1 2 3 4 5

上滑加载更多 ↓
Top