环境: centOS 7.6 2C 核 4G 内存 1 master 2 slave
腾讯云 防火墙 端口 设置 30080 ; 6443
[root@VM-16-13-centos ~]# setenforce 0
setenforce: SELinux is disabled
[root@VM-16-13-centos ~]# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
[root@VM-16-13-centos ~]# systemctl disable firewalld --now
使用kubeadm安装kubernetes_v1.19.x
检查centos / hostname
#在 master 节点和 worker 节点都要执行
cat /etc/redhat-release
#此处 hostname 的输出将会是该机器在 Kubernetes 集群中的节点名字
#不能使用 localhost 作为节点的名字
hostname
#请使用 lscpu 命令,核对 CPU 信息
# Architecture: x86_64本安装文档不支持 arm 架构
# CPU(s): 2 CPU内核数量不能低于 2
lscpu
修改hostname
如果您需要修改hostname,可执行如下指令:
#修改 hostname
hostnamectl set-hostname your-new-host-name(k8s-master01 / k8s-slave01 / k8s-slave02)
#查看修改结果
hostnamectl status
#设置 hostname 解析
echo "127.0.0.1 $(hostname)" >> /etc/hosts
检查网络
在所有节点执行命令
[root@demo-master-a-1 ~]$ ip route show
default via 172.21.0.1 dev eth0
169.254.0.0/16 dev eth0 scope link metric 1002
172.21.0.0/20 dev eth0 proto kernel scope link src 172.21.0.12
[root@demo-master-a-1 ~]$ ip address
1: lo:
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0:
link/ether 00:16:3e:12:a4:1b brd ff:ff:ff:ff:ff:ff
inet 172.17.216.80/20 brd 172.17.223.255 scope global dynamic eth0
valid_lft 305741654sec preferred_lft 305741654sec
kubelet使用的IP地址
[if !supportLists]· [endif]ip route show命令中,可以知道机器的默认网卡,通常是 eth0,如default via 172.21.0.23 dev eth0
[if !supportLists]· [endif]ip address命令中,可显示默认网卡的 IP 地址,Kubernetes 将使用此 IP 地址与集群内的其他节点通信,如 172.17.216.80
[if !supportLists]· [endif]所有节点上Kubernetes所使用的 IP 地址必须可以互通(无需 NAT 映射、无安全组或防火墙隔离)
安装docker及kubelet
使用root身份在所有节点执行如下代码,以安装软件:
[if !supportLists]· [endif]docker
[if !supportLists]· [endif]nfs-utils
[if !supportLists]· [endif]kubectl / kubeadm / kubelet
# 在 master 节点和 worker 节点都要执行
# 最后一个参数 1.19.5 用于指定 kubenetes 版本,支持所有 1.19.x 版本的安装
# 腾讯云 docker hub 镜像
# export REGISTRY_MIRROR="https://mirror.ccs.tencentyun.com"
# DaoCloud 镜像
# export REGISTRY_MIRROR="http://f1361db2.m.daocloud.io"
# 华为云镜像
# export REGISTRY_MIRROR="https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com"
# 阿里云 docker hub 镜像
export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com
curl -sSL https://kuboard.cn/install-script/v1.19.x/install_kubelet.sh | sh -s 1.19.5
初始化master节点
关于初始化时用到的环境变量
[if !supportLists]· [endif]APISERVER_NAME不能是 master 的 hostname
[if !supportLists]· [endif]APISERVER_NAME必须全为小写字母、数字、小数点,不能包含减号
[if !supportLists]· [endif]POD_SUBNET所使用的网段不能与 master节点/worker节点所在的网段重叠。该字段的取值为一个 CIDR值,如果您对 CIDR 这个概念还不熟悉,请仍然执行 export POD_SUBNET=10.100.0.1/16 命令,不做修改
请将脚本最后的1.19.5替换成您需要的版本号, 脚本中间的v1.19.x不要替换
# 只在 master 节点执行
# 替换 x.x.x.x 为 master 节点实际 IP(请使用内网 IP)
# export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令
export MASTER_IP=x.x.x.x
# 替换 apiserver.demo 为 您想要的 dnsName
export APISERVER_NAME=apiserver.demo
# Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中
export POD_SUBNET=10.100.0.1/16
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
curl -sSL https://kuboard.cn/install-script/v1.19.x/init_master.sh | sh -s 1.19.5
出错了
[if !supportLists]· [endif]请确保您的环境符合安装docker及kubelet中所有勾选框的要求
[if !supportLists]· [endif]请确保您使用root用户执行初始化命令
[if !supportLists]· [endif]不能下载kubernetes的 docker 镜像
[if !supportLists]o [endif]安装文档中,默认使用阿里云的docker镜像仓库,然而,有时候,该镜像会罢工
[if !supportLists]o [endif]如碰到不能下载docker镜像的情况,请尝试手工初始化,并修改手工初始化脚本里的第22行(文档中已高亮)为:
[if !supportLists]o [endif]imageRepository: gcr.azk8s.cn/google-containers
[if !supportLists]o [endif]
[if !supportLists]o [endif]已复制到剪贴板!
1
[if !supportLists]· [endif]检查环境变量,执行如下命令
[if !supportLists]· [endif]echo MASTER_IP=${MASTER_IP} && echo APISERVER_NAME=${APISERVER_NAME} && echo POD_SUBNET=${POD_SUBNET}
[if !supportLists]· [endif]
[if !supportLists]· [endif]已复制到剪贴板!
1
请验证如下几点:
[if !supportLists]o [endif]环境变量MASTER_IP的值应该为 master 节点的 内网IP,如果不是,请重新export
[if !supportLists]o [endif]APISERVER_NAME不能是 master 的 hostname
[if !supportLists]o [endif]APISERVER_NAME必须全为小写字母、数字、小数点,不能包含减号
[if !supportLists]o [endif]POD_SUBNET所使用的网段不能与 master节点/worker节点所在的网段重叠。该字段的取值为一个 CIDR值,如果您对 CIDR 这个概念还不熟悉,请仍然执行 export POD_SUBNET=10.100.0.1/16 命令,不做修改
[if !supportLists]· [endif]重新初始化master节点前,请先执行 kubeadm reset -f操作
检查master初始化结果
#只在 master 节点执行
#执行如下命令,等待 3-10 分钟,直到所有的容器组处于 Running 状态
watch kubectl get pod -n kube-system -o wide
#查看 master 节点初始化结果
kubectl get nodes -o wide
出错了
[if !supportLists]· [endif]ImagePullBackoff / Pending
[if !supportLists]o [endif]如果kubectl get pod -n kube-system -o wide的输出结果中出现 ImagePullBackoff 或者长时间处于 Pending 的情况,请参考 查看镜像抓取进度
[if !supportLists]· [endif]ContainerCreating
[if !supportLists]o [endif]如果kubectl get pod -n kube-system -o wide的输出结果中某个 Pod 长期处于 ContainerCreating、PodInitializing 或 Init:0/3 的状态,可以尝试:
[if !supportLists]§ [endif]查看该Pod的状态,例如:
[if !supportLists]§ [endif]kubectl describe pod kube-flannel-ds-amd64-8l25c -n kube-system
[if !supportLists]§ [endif]
[if !supportLists]§ [endif]已复制到剪贴板!
1
如果输出结果中,最后一行显示的是Pulling image,请耐心等待,或者参考 查看镜像抓取进度
Normal Pulling 44s kubelet, k8s-worker-02 Pulling image "quay.io/coreos/flannel:v0.12.0-amd64"
已复制到剪贴板!
1
[if !supportLists]§ [endif]将该Pod删除,系统会自动重建一个新的 Pod,例如:
[if !supportLists]§ [endif]kubectl delete pod kube-flannel-ds-amd64-8l25c -n kube-system
初始化worker节点
获得join命令参数
在master节点上执行
# 只在 master 节点执行
kubeadm token create --print-join-command
可获取kubeadm join命令及参数,如下所示
# kubeadm token create 命令的输出
kubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303
有效时间
该token的有效时间为 2 个小时,2小时内,您可以使用此 token 初始化任意数量的 worker 节点。
初始化worker
针对所有的worker节点执行
# 只在 worker 节点执行
# 替换 x.x.x.x 为 master 节点的内网 IP
export MASTER_IP=x.x.x.x
# 替换 apiserver.demo 为初始化 master 节点时所使用的 APISERVER_NAME
export APISERVER_NAME=apiserver.demo
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
# 替换为 master 节点上 kubeadm token create 命令的输出
kubeadm join apiserver.demo:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303
cat >> /etc/hosts << EOF
150.158.37.7 k8s-master01
101.35.191.99 k8s-slave01
81.68.80.62 k8s-slave02
EOF
[root@VM-0-11-centos ~]# cat /etc/hosts
127.0.0.1 VM-0-11-centos VM-0-11-centos
127.0.0.1 localhost.localdomain localhost
127.0.0.1 localhost4.localdomain4 localhost4
::1 VM-0-11-centos VM-0-11-centos
::1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
127.0.0.1 k8s-slave02
150.158.37.7 apiserver.demo
150.158.37.7 k8s-master01
101.35.191.99 k8s-slave01
81.68.80.62 k8s-slave02
出错了
常见错误原因
经常在群里提问为什么join不成功的情况大致有这几种:
#worker节点不能访问 apiserver
在worker节点执行以下语句可验证worker节点是否能访问 apiserver
curl -ik https://apiserver.demo:6443
已复制到剪贴板!
1
如果不能,请在master节点上验证
curl -ik https://localhost:6443
已复制到剪贴板!
1
正常输出结果如下所示:
HTTP/1.1 403 Forbidden
Cache-Control: no-cache, private
Content-Type: application/json
X-Content-Type-Options: nosniff
Date: Fri, 15 Nov 2019 04:34:40 GMT
Content-Length: 233
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
...
已复制到剪贴板!
123456789101112
可能原因
[if !supportLists]· [endif]如果master节点能够访问 apiserver、而 worker 节点不能,则请检查自己的网络设置
[if !supportLists]o [endif]/etc/hosts是否正确设置?
[if !supportLists]o [endif]是否有安全组或防火墙的限制?
#worker节点默认网卡
[if !supportLists]· [endif]Kubelet使用的 IP 地址与 master 节点可互通(无需 NAT 映射),且没有防火墙、安全组隔离
[if !supportLists]o [endif]如果你使用vmware或 virtualbox 创建虚拟机用于 K8S 学习,可以尝试 NAT 模式的网络,而不是桥接模式的网络
#移除worker节点并重试
WARNING
正常情况下,您无需移除worker节点,如果添加到集群出错,您可以移除 worker 节点,再重新尝试添加
在准备移除的worker节点上执行
#只在 worker 节点执行
kubeadm reset -f
已复制到剪贴板!
12
在master节点 demo-master-a-1 上执行
#只在 master 节点执行
kubectl get nodes -o wide
已复制到剪贴板!
12
如果列表中没有您要移除的节点,则忽略下一个步骤
#只在 master 节点执行
kubectl delete node demo-worker-x-x
已复制到剪贴板!
12
TIP
[if !supportLists]· [endif]将demo-worker-x-x替换为要移除的 worker 节点的名字
[if !supportLists]· [endif]worker节点的名字可以通过在节点 demo-master-a-1 上执行 kubectl get nodes 命令获得
检查初始化结果
在master节点上执行
# 只在 master 节点执行
kubectl get nodes -o wide
输出结果如下所示:
[root@demo-master-a-1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
demo-master-a-1 Ready master 5m3s v1.19.x
demo-worker-a-1 Ready
demo-worker-a-2 Ready
安装Ingress Controller
快速初始化
在master节点上执行
# 只在 master 节点执行
kubectl apply -f https://kuboard.cn/install-script/v1.19.x/nginx-ingress.yaml
卸载IngressController
在master节点上执行
只在您想选择其他Ingress Controller的情况下卸载
# 只在 master 节点执行
kubectl delete -f https://kuboard.cn/install-script/v1.19.x/nginx-ingress.yaml
YAML 文件
# 如果打算用于生产环境,请参考 https://github.com/nginxinc/kubernetes-ingress/blob/v1.5.5/docs/installation.md 并根据您自己的情况做进一步定制
apiVersion: v1
kind: Namespace
metadata:
name: nginx-ingress
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: nginx-ingress
namespace: nginx-ingress
---
apiVersion: v1
kind: Secret
metadata:
name: default-server-secret
namespace: nginx-ingress
type: Opaque
data:
tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN2akNDQWFZQ0NRREFPRjl0THNhWFhEQU5CZ2txaGtpRzl3MEJBUXNGQURBaE1SOHdIUVlEVlFRRERCWk8KUjBsT1dFbHVaM0psYzNORGIyNTBjbTlzYkdWeU1CNFhEVEU0TURreE1qRTRNRE16TlZvWERUSXpNRGt4TVRFNApNRE16TlZvd0lURWZNQjBHQTFVRUF3d1dUa2RKVGxoSmJtZHlaWE56UTI5dWRISnZiR3hsY2pDQ0FTSXdEUVlKCktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUwvN2hIUEtFWGRMdjNyaUM3QlBrMTNpWkt5eTlyQ08KR2xZUXYyK2EzUDF0azIrS3YwVGF5aGRCbDRrcnNUcTZzZm8vWUk1Y2Vhbkw4WGM3U1pyQkVRYm9EN2REbWs1Qgo4eDZLS2xHWU5IWlg0Rm5UZ0VPaStlM2ptTFFxRlBSY1kzVnNPazFFeUZBL0JnWlJVbkNHZUtGeERSN0tQdGhyCmtqSXVuektURXUyaDU4Tlp0S21ScUJHdDEwcTNRYzhZT3ExM2FnbmovUWRjc0ZYYTJnMjB1K1lYZDdoZ3krZksKWk4vVUkxQUQ0YzZyM1lma1ZWUmVHd1lxQVp1WXN2V0RKbW1GNWRwdEMzN011cDBPRUxVTExSakZJOTZXNXIwSAo1TmdPc25NWFJNV1hYVlpiNWRxT3R0SmRtS3FhZ25TZ1JQQVpQN2MwQjFQU2FqYzZjNGZRVXpNQ0F3RUFBVEFOCkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQWpLb2tRdGRPcEsrTzhibWVPc3lySmdJSXJycVFVY2ZOUitjb0hZVUoKdGhrYnhITFMzR3VBTWI5dm15VExPY2xxeC9aYzJPblEwMEJCLzlTb0swcitFZ1U2UlVrRWtWcitTTFA3NTdUWgozZWI4dmdPdEduMS9ienM3bzNBaS9kclkrcUI5Q2k1S3lPc3FHTG1US2xFaUtOYkcyR1ZyTWxjS0ZYQU80YTY3Cklnc1hzYktNbTQwV1U3cG9mcGltU1ZmaXFSdkV5YmN3N0NYODF6cFErUyt1eHRYK2VBZ3V0NHh3VlI5d2IyVXYKelhuZk9HbWhWNThDd1dIQnNKa0kxNXhaa2VUWXdSN0diaEFMSkZUUkk3dkhvQXprTWIzbjAxQjQyWjNrN3RXNQpJUDFmTlpIOFUvOWxiUHNoT21FRFZkdjF5ZytVRVJxbStGSis2R0oxeFJGcGZnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBdi91RWM4b1JkMHUvZXVJTHNFK1RYZUprckxMMnNJNGFWaEMvYjVyYy9XMlRiNHEvClJOcktGMEdYaVN1eE9ycXgrajlnamx4NXFjdnhkenRKbXNFUkJ1Z1B0ME9hVGtIekhvb3FVWmcwZGxmZ1dkT0EKUTZMNTdlT1l0Q29VOUZ4amRXdzZUVVRJVUQ4R0JsRlNjSVo0b1hFTkhzbysyR3VTTWk2Zk1wTVM3YUhudzFtMApxWkdvRWEzWFNyZEJ6eGc2clhkcUNlUDlCMXl3VmRyYURiUzc1aGQzdUdETDU4cGszOVFqVUFQaHpxdmRoK1JWClZGNGJCaW9CbTVpeTlZTW1hWVhsMm0wTGZzeTZuUTRRdFFzdEdNVWozcGJtdlFmazJBNnljeGRFeFpkZFZsdmwKMm82MjBsMllxcHFDZEtCRThCay90elFIVTlKcU56cHpoOUJUTXdJREFRQUJBb0lCQVFDZklHbXowOHhRVmorNwpLZnZJUXQwQ0YzR2MxNld6eDhVNml4MHg4Mm15d1kxUUNlL3BzWE9LZlRxT1h1SENyUlp5TnUvZ2IvUUQ4bUFOCmxOMjRZTWl0TWRJODg5TEZoTkp3QU5OODJDeTczckM5bzVvUDlkazAvYzRIbjAzSkVYNzZ5QjgzQm9rR1FvYksKMjhMNk0rdHUzUmFqNjd6Vmc2d2szaEhrU0pXSzBwV1YrSjdrUkRWYmhDYUZhNk5nMUZNRWxhTlozVDhhUUtyQgpDUDNDeEFTdjYxWTk5TEI4KzNXWVFIK3NYaTVGM01pYVNBZ1BkQUk3WEh1dXFET1lvMU5PL0JoSGt1aVg2QnRtCnorNTZud2pZMy8yUytSRmNBc3JMTnIwMDJZZi9oY0IraVlDNzVWYmcydVd6WTY3TWdOTGQ5VW9RU3BDRkYrVm4KM0cyUnhybnhBb0dCQU40U3M0ZVlPU2huMVpQQjdhTUZsY0k2RHR2S2ErTGZTTXFyY2pOZjJlSEpZNnhubmxKdgpGenpGL2RiVWVTbWxSekR0WkdlcXZXaHFISy9iTjIyeWJhOU1WMDlRQ0JFTk5jNmtWajJTVHpUWkJVbEx4QzYrCk93Z0wyZHhKendWelU0VC84ajdHalRUN05BZVpFS2FvRHFyRG5BYWkyaW5oZU1JVWZHRXFGKzJyQW9HQkFOMVAKK0tZL0lsS3RWRzRKSklQNzBjUis3RmpyeXJpY05iWCtQVzUvOXFHaWxnY2grZ3l4b25BWlBpd2NpeDN3QVpGdwpaZC96ZFB2aTBkWEppc1BSZjRMazg5b2pCUmpiRmRmc2l5UmJYbyt3TFU4NUhRU2NGMnN5aUFPaTVBRHdVU0FkCm45YWFweUNweEFkREtERHdObit3ZFhtaTZ0OHRpSFRkK3RoVDhkaVpBb0dCQUt6Wis1bG9OOTBtYlF4VVh5YUwKMjFSUm9tMGJjcndsTmVCaWNFSmlzaEhYa2xpSVVxZ3hSZklNM2hhUVRUcklKZENFaHFsV01aV0xPb2I2NTNyZgo3aFlMSXM1ZUtka3o0aFRVdnpldm9TMHVXcm9CV2xOVHlGanIrSWhKZnZUc0hpOGdsU3FkbXgySkJhZUFVWUNXCndNdlQ4NmNLclNyNkQrZG8wS05FZzFsL0FvR0FlMkFVdHVFbFNqLzBmRzgrV3hHc1RFV1JqclRNUzRSUjhRWXQKeXdjdFA4aDZxTGxKUTRCWGxQU05rMXZLTmtOUkxIb2pZT2pCQTViYjhibXNVU1BlV09NNENoaFJ4QnlHbmR2eAphYkJDRkFwY0IvbEg4d1R0alVZYlN5T294ZGt5OEp0ek90ajJhS0FiZHd6NlArWDZDODhjZmxYVFo5MWpYL3RMCjF3TmRKS2tDZ1lCbyt0UzB5TzJ2SWFmK2UwSkN5TGhzVDQ5cTN3Zis2QWVqWGx2WDJ1VnRYejN5QTZnbXo5aCsKcDNlK2JMRUxwb3B0WFhNdUFRR0xhUkcrYlNNcjR5dERYbE5ZSndUeThXczNKY3dlSTdqZVp2b0ZpbmNvVlVIMwphdmxoTUVCRGYxSjltSDB5cDBwWUNaS2ROdHNvZEZtQktzVEtQMjJhTmtsVVhCS3gyZzR6cFE9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
---
kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-config
namespace: nginx-ingress
data:
server-names-hash-bucket-size: "1024"
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nginx-ingress
rules:
- apiGroups:
- ""
resources:
- services
- endpoints
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- secrets
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- configmaps
verbs:
- get
- list
- watch
- update
- create
- apiGroups:
- ""
resources:
- pods
verbs:
- list
- apiGroups:
- ""
resources:
- events
verbs:
- create
- patch
- apiGroups:
- extensions
resources:
- ingresses
verbs:
- list
- watch
- get
- apiGroups:
- "extensions"
resources:
- ingresses/status
verbs:
- update
- apiGroups:
- k8s.nginx.org
resources:
- virtualservers
- virtualserverroutes
verbs:
- list
- watch
- get
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nginx-ingress
subjects:
- kind: ServiceAccount
name: nginx-ingress
namespace: nginx-ingress
roleRef:
kind: ClusterRole
name: nginx-ingress
apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-ingress
namespace: nginx-ingress
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9113"
spec:
selector:
matchLabels:
app: nginx-ingress
template:
metadata:
labels:
app: nginx-ingress
spec:
serviceAccountName: nginx-ingress
containers:
- image: nginx/nginx-ingress:1.5.5
name: nginx-ingress
ports:
- name: http
containerPort: 80
hostPort: 80
- name: https
containerPort: 443
hostPort: 443
- name: prometheus
containerPort: 9113
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
args:
- -nginx-configmaps=$(POD_NAMESPACE)/nginx-config
- -default-server-tls-secret=$(POD_NAMESPACE)/default-server-secret
#- -v=3 # Enables extensive logging. Useful for troubleshooting.
#- -report-ingress-status
#- -external-service=nginx-ingress
#- -enable-leader-election
- -enable-prometheus-metrics
#- -enable-custom-resources
配置域名解析
将域名*.demo.yourdomain.com解析到 demo-worker-a-2 的 IP 地址 z.z.z.z (也可以是 demo-worker-a-1 的地址 y.y.y.y)
验证配置
在浏览器访问a.demo.yourdomain.com,将得到 404 NotFound 错误页面
提示
许多初学者在安装Ingress Controller时会碰到问题,请不要灰心,可暂时跳过 安装Ingress Controller这个部分,等您学完 www.kuboard.cn 上 Kubernetes入门以及 通过互联网访问您的应用程序这两部分内容后,再来回顾 Ingress Controller 的安装。
也可以参考Install Nginx Ingress(opens new window)
WARNING
如果您打算将Kubernetes用于生产环境,请参考此文档 Installing Ingress Controller (opens new window),完善Ingress的配置
#下一步
在K8S中安装 Kuboard v3
腾讯云【腾讯云】云产品限时秒杀。1核2G云服务器,首年50元 立即抢购广告
在K8S中安装 Kuboard,主要考虑的问题是,如何提供 etcd 的持久化数据卷。建议的两个选项有:
[if !supportLists]1. [endif]使用hostPath提供持久化存储,将 kuboard 所依赖的 Etcd 部署到 Master 节点,并将 etcd 的数据目录映射到 Master 节点的本地目录;推荐
[if !supportLists]2. [endif]使用StorageClass动态创建 PV 为 etcd 提供数据卷;不推荐
#方法一:使用hostPath提供持久化
#安装
[if !supportLists]· [endif]执行Kuboard v3在 K8S 中的安装
[if !supportLists]o [endif]在线安装
[if !supportLists]o [endif]离线安装(K8S服务器不能访问公网)
kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
# 您也可以使用下面的指令,唯一的区别是,该指令使用华为云的镜像仓库替代 docker hub 分发 Kuboard 所需要的镜像
# kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml
定制参数
如果您想要定制Kuboard的启动参数,请将该 YAML 文件下载到本地,并修改其中的 ConfigMap
等待Kuboard v3就绪
执行指令watch kubectl get pods -n kuboard,等待kuboard名称空间中所有的 Pod 就绪,如下所示,
如果结果中没有出现kuboard-etcd-xxxxx的容器,请查看 常见错误 中关于 缺少Master Role的描述。
[root@node1 ~]# kubectl get pods -n kuboard
NAME READY STATUS RESTARTS AGE
kuboard-agent-2-65bc84c86c-r7tc4 1/1 Running 2 28s
kuboard-agent-78d594567-cgfp4 1/1 Running 2 28s
kuboard-etcd-fh9rp 1/1 Running 0 67s
kuboard-etcd-nrtkr 1/1 Running 0 67s
kuboard-etcd-ader3 1/1 Running 0 67s
kuboard-v3-645bdffbf6-sbdxb 1/1 Running 0 67s
CrashLoopBackOff
[if !supportLists]· [endif]kuboard-v3-xxxxx的容器出现 CrashLoopBackOff 的状态,可能的原因有:
[if !supportLists]o [endif]缺少kuboard-etcd-xxxx容器,请查看本章节后面关于 缺少Master Role的描述;
[if !supportLists]o [endif]kuboard-etcd-xxxx容器未就绪,请查看 kuboard-etcd-xxxx 容器的日志,解决其不能启动的问题;
[if !supportLists]· [endif]kuboard-agent-xxxxx出现 CrashLoopBackOff 的状态,可能的原因有:
[if !supportLists]o [endif]其依赖的kuboard-v3尚未就绪,请耐心等候一会儿即可(根据您的服务器下载镜像速度的不同,大约 3-5 分钟);
[if !supportLists]o [endif]kuboard-v3已经处于 READY (1/1)状态,但是集群的网络插件配置错误或者其他的网络因素,导致 kuboard-agent 的容器不能访问到 kuboard-v3 的容器;
缺少Master Role
[if !supportLists]· [endif]可能缺少Master Role的情况有:
[if !supportLists]o [endif]当您在阿里云、腾讯云(以及其他云)托管的 K8S 集群中以此方式安装 Kuboard 时,您执行 kubectl get nodes将 看不到master节点;
[if !supportLists]o [endif]当您的集群是通过二进制方式安装时,您的集群中可能缺少Master Role,或者当您删除了 Master 节点的 node-role.kubernetes.io/master=标签时,此时执行 kubectl get nodes,结果如下所示:
[root@k8s-19-master-01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-19-master-01 Ready
k8s-19-node-01 Ready
k8s-19-node-02 Ready
k8s-19-node-03 Ready
在集群中缺少Master Role节点时,您也可以为一个或者三个 worker 节点添加 k8s.kuboard.cn/role=etcd的标签,来增加 kuboard-etcd 的实例数量;
[if !supportLists]· [endif]执行如下指令,可以为your-node-name节点添加所需要的标签
kubectl label nodes your-node-name k8s.kuboard.cn/role=etcd
etcd
[if !supportLists]· [endif]Kuboard V3依赖于 etcd 提供数据的持久化服务,在当前的安装方式下,kuboard-etcd 的存储卷被映射到宿主机节点的 hostPath (/usr/share/kuboard/etcd 目录);
[if !supportLists]· [endif]为了确保每次重启,etcd能够加载到原来的数据,以 DaemonSet 的形式部署 kuboard-etcd,并且其容器组将始终被调度到 master 节点,因此,您有多少个 master 节点,就会调度多少个 kuboard-etcd 的实例;
[if !supportLists]· [endif]某些情况下,您的master节点只有一个或者两个,却仍然想要保证 kubuoard-etcd 的高可用,此时,您可以通过为一到两个 worker 节点添加 k8s.kuboard.cn/role=etcd的标签,来增加 kuboard-etcd 的实例数量;
[if !supportLists]o [endif]如果您已经安装了Kuboard V3,通过此方式调整 etcd 数量时,需要按照如下步骤执行,否则 etcd 将不能正常启动:
[if !supportLists]1. [endif]执行kubectl delete daemonset kuboard-etcd -n kuboard
[if !supportLists]2. [endif]为节点添加标签
[if !supportLists]3. [endif]执行kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
[if !supportLists]· [endif]建议etcd部署的数量为 奇数
访问Kuboard
[if !supportLists]· [endif]在浏览器中打开链接http://your-node-ip-address:30080
[if !supportLists]· [endif]输入初始用户名和密码,并登录
[if !supportLists]o [endif]用户名:admin
[if !supportLists]o [endif]密码:Kuboard123
浏览器兼容性
·请使用Chrome / FireFox / Safari / Edge等浏览器
·不兼容IE以及以 IE 为内核的浏览器
添加新的集群
[if !supportLists]· [endif]Kuboard v3是支持 Kubernetes 多集群管理的,在 Kuboard v3 的首页里,点击 添加集群按钮,在向导的引导下可以完成集群的添加;
[if !supportLists]· [endif]向Kuboard v3添加新的 Kubernetes 集群时,请确保:
[if !supportLists]o [endif]您新添加集群可以访问到当前集群Master节点 内网IP的 30080 TCP、30081 TCP、30081 UDP端口;
[if !supportLists]o [endif]如果您打算新添加到Kuboard中的集群与当前集群不在同一个局域网,请咨询 Kuboard 团队,帮助您解决问题。
卸载
[if !supportLists]· [endif]执行Kuboard v3的卸载
kubectl delete -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
清理遗留数据
在master节点以及带有 k8s.kuboard.cn/role=etcd标签的节点上执行
rm -rf /usr/share/kuboard
已复制到剪贴板!
1
方法二:使用StorageClass提供持久化
注意事项
刚接触K8S的同学,强烈建议您使用 内建用户库的方式安装 Kuboard-v3,在 K8S 中安装 Kuboard v3 时,需要理解更复杂的端口映射方式、存储卷声明/存储类等概念。
安装
[if !supportLists]· [endif]获取部署Kuboard所需的 YAML 文件
[if !supportLists]· [endif]curl -o kuboard-v3.yaml https://addons.kuboard.cn/kuboard/kuboard-v3-storage-class.yaml
[if !supportLists]· [endif]
编辑kuboard-v3.yaml文件中的配置,该部署文件中,有两处配置必须修改:
[if !supportLists]· [endif]KUBOARD_ENDPOINT
[if !supportLists]· [endif]---
[if !supportLists]· [endif]apiVersion: v1
[if !supportLists]· [endif]kind: ConfigMap
[if !supportLists]· [endif]metadata:
[if !supportLists]· [endif] name: kuboard-v3-config
[if !supportLists]· [endif] namespace: kuboard
[if !supportLists]· [endif]data:
[if !supportLists]· [endif] #关于如下参数的解释,请参考文档 https://kuboard.cn/install/v3/install-built-in.html
[if !supportLists]· [endif] # [common]
[if !supportLists]· [endif] KUBOARD_ENDPOINT: 'http://your-node-ip-address:30080'
[if !supportLists]· [endif] KUBOARD_AGENT_SERVER_UDP_PORT: '30081'
[if !supportLists]· [endif] KUBOARD_AGENT_SERVER_TCP_PORT: '30081'
storageClassName
volumeClaimTemplates:
- metadata:
name: data
spec:
#请填写一个有效的 StorageClass name
storageClassName: please-provide-a-valid-StorageClass-name-here
accessModes: [ "ReadWriteMany" ]
resources:
requests:
storage: 5Gi
部署到Kubernetes集群
kubectl create -f kuboard-v3.yaml
访问Kuboard
[if !supportLists]· [endif]在浏览器中打开链接http://your-node-ip-address:30080
[if !supportLists]· [endif]输入初始用户名和密码,并登录
[if !supportLists]o [endif]用户名:admin
[if !supportLists]o [endif]密码:Kuboard123
浏览器兼容性
·请使用Chrome / FireFox / Safari / Edge 等浏览器
·不兼容IE 以及以 IE 为内核的浏览器
卸载
[if !supportLists]· [endif]执行Kuboard v3的卸载
kubectl delete -f https://addons.kuboard.cn/kuboard/kuboard-v3-storage-class.yaml
备注
此YAML文件向 Kubernetes 中部署了一个三副本的 StatefulSet kuboard-etcd和一个单副本的 Deployment kuboard-v3;其中Deploymentkuboard-v3暂时不支持多副本,请保持其 replicas 字段为 1,将在后续的版本升级中解决 kuboard-v3多副本部署的问题。