部署k8s集群及报错完美解决方案
Posted Friends of the wind
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了部署k8s集群及报错完美解决方案相关的知识,希望对你有一定的参考价值。
部署环境
Linux版本 | CPU | MEM |
---|---|---|
CentOS7 | 双核 | 4G/node |
master | node01 |
---|---|
172.16.0.168 | 172.16.0.169 |
1、更改主机名
hostnamectl set-hostname master
hostnamectl set-hostname node01
2、添加对应域名解析
cat >> /etc/hosts << EOF
172.16.0.168 master
172.16.0.169 node01
EOF
3、防火墙,SElinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/’ /etc/selinux/config
4、 时间同步
timedatectl set-timezone Asia/Shanghai;timedatectl set-local-rtc 0
5、禁用swap
swapoff -a && sed -i ‘/swap/s/^/#/’ /etc/fstab
free -h 查看禁用效果
6、配置集群无密登录 master到node01,node02无密码
ssh-keygen -t rsa
ssh-copy-id root@node01
7、优化内核参数
[root@master ~]# modprobe br_netfilter
创建配置文件
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
net.ipv4.tcp_tw_recycle = 0
vm.swappiness = 0
vm.overcommit_memory = 1
vm.panic_on_oom = 0
fs.inotify.max_user_instances = 8192
fs.inotify.max_user_watches = 1048576
fs.file-max = 52706963
fs.nr_open = 52706963
net.ipv6.conf.all.disable_ipv6 = 1
net.netfilter.nf_conntrack_max = 2310720
EOF
加载配置
sysctl -p /etc/sysctl.d/kubernetes.conf
注意:可能报错
解决:可能是 conntrack没有加载,lsmod |grep conntrack,查看不到信息,果然是
执行下面命令 重新加载
modprobe ip_conntrack即可
拷贝配置文件到节点
[root@master ~]# scp /etc/sysctl.d/kubernetes.conf node01:/etc/sysctl.d/
节点也要加载内核:
[root@node01 ~]# sysctl -p /etc/sysctl.d/kubernetes.conf
注意:docker、k8s的版本必须一样,master、node都要安装,否则,方法也需要调整。
提示:以下是本篇文章正文内容,下面案例可供参考
一、master操作
1、需要在各节点上准备kubernetes
的yum
源,这里推荐使用阿里云的yum
源先来master
节点上操作
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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
2、配置docker加速器及更改docker默认Cgroup驱动
提示:如果没做过镜像加速,需先创建/etc/docker目录
vim /etc/docker/daemon.json
{
“registry-mirrors”: [“https://1dmptu91.mirror.aliyuncs.com”],
“exec-opts”: [“native.cgroupdriver=systemd”]
}
重新加载内核以及重启docker
systemctl daemon-reload
systemctl restart docker
3、部署k8s组件
注意:master节点部署了kubectl、kubelet、kuberadm三个组件,当然在部署前要指定和k8s版本一致的组件版本。node节点只需部署kubelet-1.18.0 kubeadm-1.18.0即可
yum install kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
无论是master还是node节点必须开机自启kubelet
systemctl enable kubelet
4、kubeadm初始化
由于国内网络环境限制,我们不能直接从谷歌的镜像站下载镜像,有两种方法可以解决,第一种:需要我们手动从docker镜像站下载镜像,然后重新命名,也可以用脚本来实现。这里我们采用第二种:在初始化k8s的时候,指定镜像源为阿里云。
方法一:初始化时指定镜像仓库为阿里云
kubeadm init --kubernetes-version=v1.18.0 --image-repository registry.aliyuncs.com/google_containers --apiserver-advertise-address 172.16.0.168--pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
方法二:将k8s集群状态配置问一个yaml文件,然后从yaml文件初始化
1)kubeadm config print init-defaults > kubeadm-config.yaml
vim kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.1.10 //改成masterIP
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: master
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
2)初始化集群
kubeadm init --config=kubeadm-config.yaml
报错:提示kubadm配置镜像下载,即便您手动导入下载好的也不认!
解决:
分析原因,部分主机命令只识别最新的镜像,导入的不是k8s官方的标签,不认,因此我们不仅导入,还要更改标签,重载内核,重启docker。
1)更改标签,以阿里云下载的为例
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.0 k8s.gcr.io/kube-apiserver:v1.18.20
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.18.0 k8s.gcr.io/kube-controller-manager:v1.18.20
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.18.0 k8s.gcr.io/kube-scheduler:v1.18.20
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.0 k8s.gcr.io/kube-proxy:v1.18.20
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7 k8s.gcr.io/coredns:1.6.7
2)删除原有镜像
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.0
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.0
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.18.0
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.18.0
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0
3)重载内核,重启docker
5、成功入下图提示:红色标线,提示您下一步需要这些操作,以及下面有节点加入集群的命令
按照箭头提示,做完;
6、添加网络组件(flannel),组件flannel可以通过https://github.com/coreos/flannel中获取
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
查看集群节点状态,未就绪状态
解决:
第一:缺少附件flannel,没有网络各Pod是无法通信的
第二:k8s部署复杂,根据主机配置,可能需要稍等,重载内核,重启docker
我们能看到从notready到ready的变化
二、node01操作
主节点的安装部署,然后个node节点的安装,和加入集群,这里注意,验证,node节点已经准备好了相关的镜像。
1、node节点仅需要两个镜像,可以手动先下载一下,或者从master节点同步
导出镜像:
docker save > pause.tar k8s.gcr.io/pause:3.2
docker save > kube-proxy.tar k8s.gcr.io/kube-proxy:v1.18.20
节点加入集群执行粘贴的命令:
提示如下:
2、登录master执行命令查看:也是需要一点时间
查看组件完整且是running状态
三、Kubernetes部署容器化应用
部署一个nginx
提示:在master提前导入或下载Nginx镜像
1)创建一个deployment资源对象,Pod控制器。
kubectl create deployment nginx --image=nginx
2)
kubectl expose deployment nginx --port=80 --type=NodePort
查看验证:
kubectl get pod,svc
访问地址:http://NodeIP:Port
注意:需要多等会,端口号是映射的容器内端口号
部署一个Tomcat
1)查看导入镜像名,注意:镜像名要复制完全,否则会,自动下载另一个版本
2)创建一个deployment资源对象,Pod控制器。
kubectl create deployment tomcat1 --image=hub.c.163.com/library/tomcat
3)Scheduler执行调度任务,将Pod分发到node上
kubectl expose deployment tomcat1 --port=8080 --type=NodePort
4)查看验证:
kubectl get pod,svc或下面命令
5)浏览器访问:http://NodeIP:Port
以上是关于部署k8s集群及报错完美解决方案的主要内容,如果未能解决你的问题,请参考以下文章
K8S kubeadm 部署出现的故障:kubectl get nodes 节点显示 NotReady