本次实验是用的Hyper-v建了三台虚拟机,进行K8s部署
目前依托虚拟机,
设置一个主节点:
192.168.20.210 master
两个工作节点:
192.168.20.211 node1
192.168.20.212 node2
一、环境设置(所有节点主机均要处理)
1、# 关闭防火墙
sudo systemctl disable firewalld --now
执行结果如下:
2、# 关闭 selinux
# 临时关闭【立即生效】告警,不启用,Permissive,查看使用 getenforce 命令
setenforce 0
# 永久关闭【重启生效】
sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
3、时间同步(默认是启动的,可以不设置)
systemctl start chronyd
systemctl enable chronyd
date
4、关闭swap分区
vi /etc/fstab
注释代码如下
# /dev/mapper/ao-swap none swap defaults 0 0
-----------------------------------------------------
# 临时关闭【立即生效】查看使用 free 命令
swapoff -a
# 永久关闭【重启生效】
sed -ri 's/.*swap.*/#&/' /etc/fstab
5、# 配置内核参数
sudo tee /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
执行结果如下:
7、# 添加主机域名映射
sudo vi /etc/hosts
#在hosts里添加下面
192.168.20.210 k8s-endpoint
192.168.20.210 k8smaster
192.168.20.211 k8snode1
192.168.20.212 k8snode2
#重启系统(重要)
reboot
二、Docker 容器安装(所有节点均需要操作)
1、添加 Docker CE 源
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2、 配置一下 Docker 的 yum 源【阿里云】
cat >/etc/yum.repos.d/docker.repo<<EOF
[docker-ce-stable]
name=Docker CE Edge - \$basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/8/x86_64/stable/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
EOF
3、安装 Docker
sudo yum -y install docker-ce-20.10.9 docker-ce-cli-20.10.9 containerd.io docker-compose-plugin
4、 配置 Docker
sudo mkdir /etc/docker
sudo tee /etc/docker/daemon.json << EOF
{"registry-mirrors": ["https://mirrors.aliyun.com/"],"exec-opts": ["native.cgroupdriver=systemd"]}
EOF
# 加载 Docker 配置
sudo systemctl daemon-reload
# Docker 服务开机启动
sudo systemctl enable docker --now
三、安装kubectl、kubelet、kubeadm(所有节点)
1、#配置k8s的yum源
sudo tee /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
EOF
执行结果如下:
2、 安装kubectl、kubelet、kubeadm
sudo yum install -y kubelet-1.23.17 kubeadm-1.23.17 kubectl-1.23.17
3、设置 kubelet 开机启动,先不启动
sudo systemctl enable kubelet
四、主节点操作(只在master节点操作)
1、初始化主节点
192.168.20.210是master节点主机的ip,k8s-endpoint已经在hosts文件里做了映射。
kubeadm init --apiserver-advertise-address=192.168.20.210 --control-plane-endpoint=k8s-endpoint --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/16 --pod-network-cidr=172.20.0.0/16
执行成功后如下图:红色框内的串即是其他node节点加入集群的命令代码。
ps:初始报错可以使用以下命令进行重置后再继续执行上面的初始化代码
kubeadm reset -f
2、初始化完成后添加 kubernetes 配置
# 以下内容在初始化主节点中完成信息中
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
五、安装 calico 网络(主节点)(只在master节点操作)
1、使用flannel插件(与下面calico二选一,flannel测试不通!!!有解决方法请留言)
# 下载网络插件配置
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#因为国外镜像被墙,下载完文件后请将里面的image地址换成国内的(有条件的小朋友可以自行拉了推到国内镜像仓库)
# 添加
kubectl apply -f kube-flannel.yml
# 等一会!
# ......
# 查看状态 【kube-system 是 k8s 中的最小单元】
kubectl get pods -n kube-system
2、使用calico插件(与上面flannel二选一,此方法可行)
# 下载配置文件
curl https://docs.projectcalico.org/v3.15/manifests/calico.yaml -O
# 调整为自己的网络配置
vi calico.yaml
在3589行,取消3589、3590两行的注释,并将 192.168.0.0 改为 172.20.0.0,调整后如下所示
同时注意替换文件里面的镜像地址!!!
#修改完应用部署
kubectl apply -f calico.yaml
六、安装 kuboard(K8s可视化操作工具)(主节点)
kuboard官网:安装 Kubernetes 多集群管理工具 - Kuboard v3 | Kuboard
这里我们选择V3版本
1、执行 Kuboard v3 在 K8S 中的安装,执行下列命令
wget https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
文件下载下来后注意修改里面的镜像地址:替换的关键位置如:
KUBOARD_QUESTDB_IMAGE(第23行)
image(第126行、第219行)
共三处镜像,可以想办法拉到本地后推送到国内镜像仓库。
kubectl apply -f kuboard-v3.yaml
等待 Kuboard v3 就绪
执行指令 watch kubectl get pods -n kuboard 可以查看执行情况,如下图
五、工作节点操作(工作节点)
1、将工作节点加入到集群中
# 以下内容在初始化主节点中完成信息中需要根据实际情况进行替换
kubeadm join k8s-endpoint:6443 --token dscoox.z42u4wjrvw0nzvfw --discovery-token-ca-cert-hash sha256:8a0c4d6f61c0583eb4f2d571ddcab1328cc2183cb42cf6d5f7a4f1a27dd1be18
添加成功后如下:
默认 token 有效期为 24 小时,当过期之后,该 token 就不可用了。这时就需要重新创建 token,操作如下:
kubeadm token create --print-join-command
#可以用下面的命令在master节点查看是否加入成功
kubectl get nodes
过程中遇到的问题:
1、docker启动失败
报错信息如下:
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.
经检查可能是daemain.json文件格式有问题,稳妥点的做法把,格式删了统一成一行如下图:
2、加入工作节点时出现token过期,报下面错误。
error execution phase preflight: couldn't validate the identity of the API Server: could not find a JWS signature in the cluster-info ConfigMap for token ID "arxcdy"
To see the stack trace of this error execute with --v=5 or higher
解决办法:
在mater节点主机上执行
kubeadm token create --print-join-command
会生成新的加入命令
复制到子节点上执行即可。
3、修改NodePort的范围
在 Kubernetes 集群中,NodePort 默认范围是 30000-32767,某些情况下,因为您所在公司的网络策略限制,您可能需要修改 NodePort 的端口范围,本文描述了具体的操作方法。
#修改kube-apiserver.yaml
使用 kubeadm 安装 K8S 集群的情况下,您的 Master 节点上会有一个文件 /etc/kubernetes/manifests/kube-apiserver.yaml
,修改此文件,向其中添加 --service-node-port-range=10000-60000
(请使用您自己需要的端口范围),如下所示:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
component: kube-apiserver
tier: control-plane
name: kube-apiserver
namespace: kube-system
spec:
containers:
- command:
- kube-apiserver
- --advertise-address=172.17.216.80
- --allow-privileged=true
- --authorization-mode=Node,RBAC
- --client-ca-file=/etc/kubernetes/pki/ca.crt
- --enable-admission-plugins=NodeRestriction
- --enable-bootstrap-token-auth=true
- --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
- --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
- --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
- --etcd-servers=https://127.0.0.1:2379
- --insecure-port=0
- --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt
- --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt
- --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key
- --requestheader-allowed-names=front-proxy-client
- --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
- --requestheader-extra-headers-prefix=X-Remote-Extra-
- --requestheader-group-headers=X-Remote-Group
- --requestheader-username-headers=X-Remote-User
- --secure-port=6443
- --service-account-key-file=/etc/kubernetes/pki/sa.pub
- --service-cluster-ip-range=10.96.0.0/12
- --service-node-port-range=10000-60000
- --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
- --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.16.0
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 8
httpGet:
host: 172.17.216.80
path: /healthz
port: 6443
scheme: HTTPS
initialDelaySeconds: 15
timeoutSeconds: 15
...
#重启apiserver
执行以下命令,重启 apiserver
# 获得 apiserver 的 pod 名字
export apiserver_pods=$(kubectl get pods --selector=component=kube-apiserver -n kube-system --output=jsonpath={.items..metadata.name})
# 删除 apiserver 的 pod
kubectl delete pod $apiserver_pods -n kube-system
#验证结果
执行以下命令,验证修改是否生效:
kubectl describe pod $apiserver_pods -n kube-system
输出结果如下所示:(此时,我们可以看到,apiserver 已经使用新的命令行参数启动)
...
Host Port: <none>
Command:
kube-apiserver
--advertise-address=172.17.216.80
--allow-privileged=true
--authorization-mode=Node,RBAC
--client-ca-file=/etc/kubernetes/pki/ca.crt
--enable-admission-plugins=NodeRestriction
--enable-bootstrap-token-auth=true
--etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
--etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
--etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
--etcd-servers=https://127.0.0.1:2379
--insecure-port=0
--kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt
--kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key
--kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
--proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt
--proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key
--requestheader-allowed-names=front-proxy-client
--requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
--requestheader-extra-headers-prefix=X-Remote-Extra-
--requestheader-group-headers=X-Remote-Group
--requestheader-username-headers=X-Remote-User
--secure-port=6443
--service-account-key-file=/etc/kubernetes/pki/sa.pub
--service-cluster-ip-range=10.96.0.0/12
--service-node-port-range=10000-60000
--tls-cert-file=/etc/kubernetes/pki/apiserver.crt
--tls-private-key-file=/etc/kubernetes/pki/apiserver.key
State: Running
Started: Mon, 11 Nov 2019 21:31:39 +0800
Ready: True
Restart Count: 0
Requests:
cpu: 250m
...