K8S安装(非生产环境)

1、初始环境

前面是内网IP  后面是外网IP
==========================================
t1 	master  10.105.79.74   123.xxx.205.192
t2 	worker  10.105.90.27   123.xxx.185.178
t3 	worker  10.154.6.123   115.xxx.74.23
==========================================

目标环境

Kubernetes v1.16.0
 --- calico 3.8.2
 --- nginx-ingress 1.5.5
Docker 18.09.7

2、检查 centos / hostname

# 在 master 节点和 worker 节点都要执行
cat /etc/redhat-release

# 此处 hostname 的输出将会是该机器在 Kubernetes 集群中的节点名字
# 不能使用 localhost 作为节点的名字
hostname

# 请使用 lscpu 命令,核对 CPU 信息
# Architecture: x86_64    本安装文档不支持 arm 架构
# CPU(s):       2         CPU 内核数量不能低于 2
lscpu

3、修改 hostname

# 修改 hostname
hostnamectl set-hostname your-new-host-name(t1 t2 t3)
# 查看修改结果
hostnamectl status
# 设置 hostname 解析
echo "127.0.0.1   $(hostname)" >> /etc/hosts

4、安装 docker / kubelet

分别登录三台机器执行
curl -sSL https://kuboard.cn/install-script/v1.16.0/install-kubelet.sh | sh

5、初始化 master 节点

# 只在 master 节点执行
# 替换 x.x.x.x 为 master 节点实际 IP(请使用内网 IP)
# export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令
export MASTER_IP=x.x.x.x   //export MASTER_IP=10.105.79.74
# 替换 apiserver.demo 为 您想要的 dnsName (不建议使用 master 的 hostname 作为 APISERVER_NAME)
export APISERVER_NAME=apiserver.demo
# Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中
export POD_SUBNET=10.100.0.1/20
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts
curl -sSL https://kuboard.cn/install-script/v1.16.0/init-master.sh | sh

6、检查 master 初始化结果

# 只在 master 节点执行

# 执行如下命令,等待 3-10 分钟,直到所有的容器组处于 Running 状态
watch kubectl get pod -n kube-system -o wide

# 查看 master 节点初始化结果
kubectl get nodes -o wide
[root@t1 install]# kubectl get nodes -o wide
NAME   STATUS   ROLES    AGE     VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION               CONTAINER-RUNTIME
t1     Ready    master   2m57s   v1.16.0   10.105.79.74   <none>        CentOS Linux 7 (Core)   3.10.0-957.21.3.el7.x86_64   docker://18.9.7

7、初始化 worker节点

# 只在 master 节点执行
kubeadm token create --print-join-command
可获取kubeadm join 命令及参数,如下所示
# kubeadm token create 命令的输出
kubeadm join apiserver.demo:6443 --token pxq7n7.j7l9qk87mu9a3isd     --discovery-token-ca-cert-hash sha256:d0271acf4302e5e31f23e3fbc77b4f451196681fc5900d72f6a763ffec5f1bbf

所有节点上

# 只在 worker 节点执行
# 替换 ${MASTER_IP} 为 master 节点实际 IP
# 替换 ${APISERVER_NAME} 为初始化 master 节点时所使用的 APISERVER_NAME
export MASTER_IP=10.105.79.74
export APISERVER_NAME=apiserver.demo
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts

# 替换为 master 节点上 kubeadm token create 命令的输出
kubeadm join apiserver.demo:6443 --token pxq7n7.j7l9qk87mu9a3isd     --discovery-token-ca-cert-hash sha256:d0271acf4302e5e31f23e3fbc77b4f451196681fc5900d72f6a763ffec5f1bbf

8、检查初始化结果

# 只在 master 节点执行
kubectl get nodes -o wide
[root@t1 install]# kubectl get nodes 
NAME   STATUS   ROLES    AGE     VERSION
t1     Ready    master   12m     v1.16.0
t2     Ready    <none>   3m9s    v1.16.0
t3     Ready    <none>   2m36s   v1.16.0

9、移除 worker 节点

在准备移除的worker节点上执行
kubeadm reset

在 master节点上执行
# 只在 master 节点执行
kubectl delete node demo-worker-x-x

10、安装 Ingress Controller

在 master节点上执行
kubectl apply -f https://kuboard.cn/install-script/v1.16.0/nginx-ingress.yaml

11、安装Kuboard

# 安装
kubectl apply -f https://kuboard.cn/install-script/kuboard.yaml

#获取管理员登录Token
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}')   

[root@t1 install]# kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}')   
Name:         kuboard-user-token-bcdqp
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: kuboard-user
              kubernetes.io/service-account.uid: dfe0a2df-883a-40b8-8e03-ea6f9b445e36

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IktXN19Dcl91Nm1NV01JTE5lOXQ2dWlQLXB6M0l5WnZsVEdCR2dqZkw3U0EifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJvYXJkLXVzZXItdG9rZW4tYmNkcXAiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoia3Vib2FyZC11c2VyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZGZlMGEyZGYtODgzYS00MGI4LThlMDMtZWE2ZjliNDQ1ZTM2Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmt1Ym9hcmQtdXNlciJ9.kRwnI3DRDIoobgkwzzXKNCBOr1570Mp8ZMsp4b2tCpKm45pQS7IH-yFAE_sddSin4tbUxiu2ps7_vJW-EJw8f8S49S0tN9ah91vXrFgt1-ZU33m_P6qBqI2hdjtf21L-F8jJyES4sFRvO0PDfV_W6JN5BOstBRZKKwjxnNMZ5wfdFtPfb47Cl3EeB_2_12BVoVYGC4USZ9XFoJq7MLKFo5LJPe5ZQC22HQyrGCdpVK_zvcXfbRyAxwIMZEchvZUuR7FRQuSFEXo_SbxNFgvNXlSOPO6FXs4vDz0w-q8rUj1l-wy4CW9eAXclH8r0FcFZuNGFplQhieZebGXml-svtQ


#获取只读用户登录Token
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kuboard-viewer | awk '{print $1}')   


#访问Kuboard
http://123.xxx.185.178:32567/

未来配置https访问方式

#卸载
kubectl delete -f https://kuboard.cn/install-script/kuboard.yaml

12、外网负载均衡 配置Let’s Encript SSL证书

kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v0.10.0/cert-manager.yaml

13、kubctr命令自动补齐

source <(kubectl completion bash)

永久生效
yum install bash-completion -y
echo "source <(kubectl completion bash)" >> ~/.bashrc

14、查看、创建命令空间

步骤一:理解默认的命名空间
$ kubectl get namespaces

步骤二:创建新的命名空间
使用kubectl创建这个开发命名空间和生产命名空间
$ kubectl create -f namespace-dev.json
$ kubectl create -f namespace-prod.json
查看结果
$ kubectl get namespaces --show-labels

步骤三:在每个命名空间中创建Pods

首先检查上下文
$ kubectl config view

下一步是为kubectl客户端定义在每个命名空间工作的上下文。“集群”和“用户”域的值是从当前上下文拷贝过来的
$ kubectl config set-context dev --namespace=development --cluster=kubernetes --user=kubernetes-admin
$ kubectl config set-context prod --namespace=production --cluster=kubernetes --user=kubernetes-admin

切换到dev命名空间
kubectl config use-context dev

切换到prod命名空间
kubectl config use-context prod

附录:各个脚本内容

1、namespace-dev.json

{
  "kind": "Namespace",
  "apiVersion": "v1",
  "metadata": {
    "name": "development",
    "labels": {
      "name": "development"
    }
  }
}

2、namespace-prod.json

{
  "kind": "Namespace",
  "apiVersion": "v1",
  "metadata": {
    "name": "production",
    "labels": {
      "name": "production"
    }
  }
}

参考:

1、安装教程 - https://kuboard.cn/install/install-k8s.html

2、客户端控制远程K8S - https://kuboard.cn/install/install-kubectl.html#%E9%85%8D%E7%BD%AE-kubectl-%E5%AE%A2%E6%88%B7%E7%AB%AF

3、NGINX Ingress Controller 1.5.6 - https://github.com/nginxinc/kubernetes-ingress/releases

4、生产环境请-安装Kubernetes高可用 - https://kuboard.cn/install/install-kubernetes.html - https://www.kubernetes.org.cn/5904.html