Kubernetes K8S Kuboard搭建 1主 2从 集群Cluster 3*2C 4G CentOS7.6 ECS DevOps日志. OK



环境:  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: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    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: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

    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    <none>   2m26s   v1.19.x

demo-worker-a-2   Ready    <none>   3m56s   v1.19.x





安装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    <none>   19d   v1.19.11

k8s-19-node-01     Ready    <none>   19d   v1.19.11

k8s-19-node-02     Ready    <none>   19d   v1.19.11

k8s-19-node-03     Ready    <none>   19d   v1.19.11







在集群中缺少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多副本部署的问题。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容