k8s集群搭建【1个master_1个node】 亲测成功!
1:安装docker2:安装kubeadm/kubectl/kubelet3:创建master节点的集群(并安装网络插件calico)4:添加node节点到集群5:创建pod验证集群可用性6:卸载当前版本k8s7:重启master8:重启node1。
·
k8s集群搭建
k8s_1个master_1个node_集群搭建
步骤小结
1:安装docker
2:安装kubeadm/kubectl/kubelet
3:创建master节点的集群(并安装网络插件calico)
4:添加node节点到集群
5:创建pod验证集群可用性
6:卸载当前版本k8s
7:重启master
8:重启node1
下面对于master、Node节点同时进行
1.安装docker
sudo yum update
yum install -y docker-ce #安装免费版
vim /etc/docker/daemon.json #修改docker的cgroup驱动为systemd,否则kubeadm --init的时候会报错
# 添加这段json配置:
{"exec-opts": ["native.cgroupdriver=systemd"]}
systemctl daemon-reload # 重载配置
systemctl restart docker #启动docker服务
systemctl enable docker.service
docker run hello-world #会自动去拉取镜像,成功运行表示docker服务启动成功
2.安装k8s
#设置主机名字,不管是master还是node节点,都需要这样设置一下,不然kubeadmin join的时候会使用默认名字,而导致冲突,进而添加失败,名字随便,只需要唯一即可
#master节点上`hostnamectl set-hostname master`
hostnamectl set-hostname master
#node节点上`执行hostnamectl set-hostname node1`
hostnamectl set-hostname node1
#修改ip映射,不然安装时无法解析hostname(两个节点上都改就行)
vim /etc/host
10.255.0.67 master
10.255.0.69 node1
#关防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
#对file中每行匹配到的第一个字符串进行替换格式为:sed -i 's/原字符串/新字符串/'file
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
#配置网络,便于各pod的通信
vim /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#刷新配置
sysctl -p /etc/sysctl.d/k8s.conf
#关交换内存
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
#配置镜像源,直接装kubectl会报错找不到
vim /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
EOF
# 刷新包管理器
yum update
#查看kubelet有哪些版本
yum --showduplicates list kubelet
#安装
yum -y install kubeadm-1.22.0 kubectl-1.22.0 kubelet-1.22.0 #此处安装指定版本-1.22.0
#yum install -y kubelet kubeadm kubectl #此处安装最新版本
下面只对于master节点进行
3.创建集群
#启动kubelet服务并查看状态,此时kubelet服务的状态应该为auto-restart,也可能为dead,init后再次手动启动即可,因为需要kubeadm --init成功,kubelet服务才能启动
systemctl start kubelet & systemctl status kubelet
#设置kubelet开机启动
systemctl enable kubelet.service
#apiserver-advertise-address表示master ip
#文档地址https://kubernetes.io/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-init/
#初始化集群,初始化成功时记得保存它自动输出的:kubeadm join xx token xxxx,后续添加节点的时候会用到
kubeadm init --apiserver-advertise-address=10.255.xx.xx --image-repository registry.aliyuncs.com/google_containers
#成功初始化后显示:
------------------------------------------------------------------------------------------------------------------------
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/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.255.xx.xx:6443 --token 3nbxco.tvtwkyxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:8f142ba308e9bda7cab26e86ba44b1a7ca98654ab6c9xxxxxxxxxxxxxxxxxxxx
------------------------------------------------------------------------------------------------------------------------
#--v=6 #类似于verbose; 查看集群初始化状态
systemctl start kubelet & systemctl status kubelet
#若执行上面那条命令报:[ERROR CRI]: container runtime is not running的错,则按如下操作把disabled_plugins = ["cri"] 这一行改成disabled_plugins = [],然后重启服务,然后再次执行init
#没有报错不用执行
sudo vim cat /etc/containerd/config.toml #修改配置文件
systemctl restart containerd #重启容器服务
#如果因为已经安装过一次,此时再次kubeadm --init会报错,需要执行kubeadm reset命令来重置,然后再执行init
#如果一直卡在[kubelet-check] Initial timeout of 40s passed.
#查看kubelet日志,总之就是看--init时apiserver的ip有没有搞错、docerk服务是否执行了systemctl enable docker.service
journalctl -u kubelet # 查看日志
#此时运行kubectl get nodes会报错,需要在master上先执行下列命令,此处操作是kubeadm --init成功后会提示你要把KUBECONFIG导出,然后source一下
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
chown $(id -u):$(id -g) $HOME/.kube/config
#查看节点状态,此时状态为notReady需要安装网络
kubectl get nodes
#安装calico(网络插件)
wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate
#不行换成这个 wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
#再不行手动下载传上去
kubectl apply -f calico.yaml
kubectl get pods -n kube-system #查看calico是否运行
kubectl get nodes #如果apply之后立即查可能会显示NotReady,过一会再查就是ready了
下面操作只在Node节点上进行
4.添加节点
#1:安装docker,同步骤1,略
#2:安装k8s,同步骤2
#3:启动Kubelet
systemctl start kubelet &systemctl status kubelet
#4:node1主动申请添加到集群中,10.255.xx.xx为master的IP,下面这条语句就是master机器在执行kubeadm --init时所打印的,此处复制粘贴即可,把当前节点加入到master节点的集群。
kubeadm join 10.255.xx.xx:6443 --token 3nbxco.tvtwkyxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:8f142ba308e9bda7cab26e86ba44b1a7ca98654ab6c94xxxxxxxxxxxxxxxxxxxx
#下面的操作是在master上。查看所有节点信息,马上查看可能会显示NotReady,需要等一会才会显示为Ready
kubectl get nodes
#显示下面的结果,即集群搭建成功
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 34m v1.22.0
node1 Ready <none> 2m46s v1.22.0
5.创建一个 nginx pod来验证集群是否能正常工作,在master上执行
# 创建pod
kubectl create -f https://k8s.io/examples/pods/pod-nginx.yaml --record
# 也可以先下载到本地,再修改部署
wget https://k8s.io/examples/pods/pod-nginx.yaml --no-check-certificate
kubectl apply -f pod-nginx.yaml --record
# 查看 pod
kubectl get pod -o wide # 查看状态是否为Running 以及IP,立马查看可能显示处于Pending状态,可能要等一会才会显示为Running,如果一直是pending,说明其他地方有问题
# 查看 pod 详情,查看问题所在
kubectl describe pod pod-name
# 如果是节点标签问题导致容器调度失败,给节点设置标签
# 列出当前集群中的节点和它们的标签:
kubectl get nodes --show-labels
# 给节点node1 添加标签 disktype=ssd
kubectl label nodes node1 disktype=ssd
# 给节点node1 删除标签 disktype=ssd
kubectl label nodes node-1 disktype-
# 重新部署
kubectl apply -f pod-nginx.yaml --record
6.卸载k8s
yum -y remove kubelet kubeadm kubectl #卸载当前版本的kube系列,因为如果master和node1如果k8s版本不同也会报错
yum -y install kubeadm-1.22.0 kubectl-1.22.0 kubelet-1.22.0 #安装指定版本
7.重启master
#master上执行
kubeadm reset #这个命令就是重启集群
systemctl restart docker #启动docker服务
systemctl enable docker.service #自启动
systemctl start kubelet & systemctl status kubelet
kubeadm init --apiserver-advertise-address=10.255.xx.xx --image-repository registry.aliyuncs.com/google_containers
#master上执行,node1不需要(凡是在node1上执行报 Config not found: /etc/kubernetes/admin.conf的错的指令都是需要在master执行的
kubectl apply -f calico.yaml
kubectl get nodes
8.重启node1。下面的命令都是在node1上执行
#改了host之后好像需要需要kubeadm reset
kubeadm reset #这个命令就是重启集群
#如果报错10250端口被占用,就用这个查看进程号
netstat -anp |grep 10250
kill -9 进程号
systemctl restart docker #启动docker服务
systemctl enable docker.service
systemctl start kubelet & systemctl status kubelet
#node1上执行,先删除两个文件,这两个文件是在执行join的时候会自动生成,如果已存在则会报错
rm /etc/kubernetes/kubelet.conf
rm /etc/kubernetes/pki/ca.crt
kubeadm join 10.255.xx.xx:6443 --token 3nbxco.tvtwkyxxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:8f142ba308e9bda7cab26e86ba44b1a7ca98654ab6c9xxxxxxxxxxxxxxxxxxxx
更多推荐
已为社区贡献1条内容
所有评论(0)