最近公司在推行容器化,有必要对容器和K8S相关知识进行系统学习和复习。前段时间正好买了几台服务器,想着可以先搭建套K8S环境用于实际操作,搭建过程花费了一个周末的时间学习。这个过程中遇到了各种各样的问题,基本都在网上找到了答案。因此这个过程有必要整理和汇总一下,方便其他同学可以快速搭建,节省时间。
本文基于公有云主要介绍K8S的安装过程,涉及Master、Node节点的环境搭建,calico网络插件的使用;然后介绍Kuboard的安装以及K8S的简单操作命令,最后附上常见的报错安装与处理方式。
[1] 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
[2] 关闭selinux
# 永久关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config
# 临时关闭
setenforce 0
[3] 关闭swap
# 临时
swapoff -a
# 永久
sed -ri 's/.*swap.*/#&/' /etc/fstab
[4] 根据规划设置主机名
hostnamectl set-hostname k8smaster
k8smaster为自定义的hostname, 需要与[5]中保持一致
[5] 在master添加hosts
cat >> /etc/hosts << EOF
120.xx.xx.230 k8smaster
120.xx.xx.151 k8snode1
120.xx.xx.21 k8snode2
EOF
k8snode1和k8snode2为Node节点的自定义hostname
[6] 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system # 生效
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
{
"registry-mirrors": [
"https://n7d4jdun.mirror.aliyuncs.com",
"https://7mimmp7p.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
],
"insecure-registries": ["120.xx.xx.230:5000"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
重点是cgroup属性设置为systemd;
其中:120.xx.xx.230:5000配置的是本地镜像Harbor仓储地址,有需要参考服务器环境搭建-2 Docker与Harbor
修改配置后,需要重载配置文件以及重启Docker:
systemctl daemon-reload && systemctl restart docker
#安装
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
#设置为开机自启动以及启动
systemctl enable kubelet && systemctl start kubelet
安装时可以指定版本,比如需要安装1.23.0的Kubernates:
yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0 --disableexcludes=kubernetes
kubeadm init --image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.0 \
--pod-network-cidr 10.244.0.0/16 \
--apiserver-advertise-address 120.xx.xx.230
120.xx.xx.230为Master节点的地址,用于设置API Server地址;之后Node节点通过该IP加入集群。
等待一段时间,直到出现如下信息:
这里注意复制保存一下 kubeadm join这行的命令,之后再Node节点上执行。
初始化完成后,需要配置kubeconfig路径:
export KUBECONFIG=/etc/kubernetes/admin.conf
在各Node节点上分别执行1.1-1.4;
这里我将两个Node节点分别自定义为k8snode1和k8snode2;
执行kubeadm join命令:
此时,登录Master节点,查看各节点运行情况:
发现k8snode1和k8snode2处于NotReady状态,因为尚未安装网络插件。
cat > /etc/NetworkManager/conf.d/calico.conf <
[keyfile]
unmanaged-devices=interface-name:cali*;interface-name:tunl*;interface-name:vxlan.calico;interface-name:wireguard.cali
EOF
【1】下载calico.yaml文件
wget https://docs.projectcalico.org/v3.23/manifests/calico.yaml --no-check-certificate
【2】修改镜像地址 calico.yaml
防止下载calico需要的镜像失败,建议作如下修改:
#docker.io/calico/xxx 修改为:calico/cni:v3.23.0
sed -i 's#docker.io/##g' calico.yaml
【3】根据配置文件安装calico
kubectl apply -f calico.yaml
查看calico的安装进度:
安装完成后,再次查看各节点的状态:
发现节点均处于Ready状态,表面Kubernates安装完成。
当k8s整体安装完成后,Kuboard安装就轻松了。
kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml
#查看Kuboard的安装进度
kubectl get pods -n kuboard
如下表示Kuboard安装成功:
Kuboard的默认用户密码为: admin/Kuboard123
访问地址: http://{master/node_ip}:30080
由于后续会专题介绍K8S原理和操作,所以这里围绕kubectl命令进行简单介绍。
[1] 首先创建一个命名空间:
kubectl create ns seong
kubectl run httpd-instance --image=httpd -n seong
kubectl get pods -n seong -o wide
发现pod被调度到k8snode1上:
登录Kuboard查看情况:
【1】创建一个简单的deploy资源的yml文件:
还是以httpd为例,创建一个deployment,并设置副本数目为2,yml文件如下所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-httpd
labels:
app: httpd
spec:
replicas: 2
selector:
matchLabels:
app: httpd
template:
metadata:
labels:
app: httpd
spec:
containers:
- name: httpd
image: httpd
ports:
- containerPort: 80
【2】创建deploy负载
kubectl apply -f testHttpd.yaml -n seong
【3】登录Kuboard查看deploy状态
上图显示两个httpd副本运行正常;后面可以直接通过Kuboard进行K8S资源的创建,通过界面操作而非yml的方式会更轻松,读者可以自行操作。
由于公网IP在云服务器上不可见,如果配置api-server地址为公有云地址时(不设置时,从节点无法连接),etcd会在初始化过程中报错;可通过开启EIP直通,使得公网IP再本机可见:
【1】下载sh脚本
wget https://eip-direct-1254277469.cos.ap-guangzhou.myqcloud.com/eip_direct.sh
【2】2.执行shell:
chmod +x eip_direct.sh
./eip_direct.sh install XX.XX.XX.XX
xx.xx.xx.xx表示云服务器的对外公网IP;
【3】在公有云控制台上,开启EIP直通
【4】在服务器上查询是否完成开通
注意:安装时,需要保证各节点的版本一致;安装失败时,也可以排查一下上述步骤是否有被跳过:如Docker的cgroup需设置为systemd,防火墙保持关闭等;
其他问题基本可以通过journalctl -xeu kubelet | grep Failed 结合Docker logs诊断以及网上搜索解决。