实战案例-原生Kubernetes云平台部署

目录

  • 原生Kubernetes云平台部署
    • 案例目标
    • 案例分析
      • 1、规划节点
      • 2、基础准备
    • 案例实施
      • 1、基础环境配置
      • 2、安装Kubernetes集群

原生Kubernetes云平台部署

案例目标

(1)了解Kubernetes容器云平台的架构。
(2)了解Kubernetes容器云平台的基本原理。
(3)掌握使用Kubeadm部署Kubernetes集群。

案例分析

1、规划节点

该案例使用两台节点操作,一台作为Master节点,一台作为Node节点,IP自拟、互通

2、基础准备

所有节点使用CentOS_7.5.1804系统,保持网络通畅。

案例实施

1、基础环境配置

1.1、配置Yum源
所有节点将提供的压缩包K8S.tar.gz上传至/root目录并解压

[root@master ~]# tar -zxvf K8S.tar.gz

所有节点配置本地Yum源(可使用FTP方式共享源)

[root@master ~]# mv /etc/yum.repos.d/* /opt/
[root@master ~]# vi /etc/yum.repos.d/local.repo
[root@master ~]# cat /etc/yum.repos.d/local.repo
[kubernetes]
name=kubernets
baseurl=file:///root/Kubernetes
gpgcheck=0
enable=1

[root@master ~]# yum clean all && yum repolist
已加载插件:fastestmirror, langpacks
正在清理软件源: kubernetes
已加载插件:fastestmirror, langpacks
Determining fastest mirrors
kubernetes                                                       | 2.9 kB  00:00:00
kubernetes/primary_db                                            | 777 kB  00:00:00
源标识                                    源名称                                    状态
kubernetes                                kubernets                                 341
repolist: 341

1.2、升级系统内核
所有节点升级系统内核

[root@master ~]# yum update -y

1.3、配置主机映射
所有节点,修改/etc/hosts文件,添加所有节点IP映射

[root@master ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.200.10 master
192.168.200.20 node

1.4、配置防火墙及SELinux

[root@master ~]# systemctl stop firewalld && systemctl disable firewalld
[root@master ~]# iptables -F
[root@master ~]# iptables -X
[root@master ~]# iptables -Z
[root@master ~]# iptables-save
[root@master ~]# cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled #将模式修改为关闭
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

[root@master ~]# reboot

1.5、关闭Swap
ps:Kubernetes的想法是将实例紧密包装到尽可能的100%。所有的部署应该与CPU和内存限制固定在一起。所以如果调度程序发送一个Pod到一台机器,他不应该使用交换。设计者不想交换,因为它会减慢速度。所以关闭Swap主要是为了性能考虑。
所有节点关闭Swap。

[root@master ~]# swapoff -a
#注释掉swap分区的挂载参数
[root@master ~]# vi /etc/fstab
[root@master ~]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Wed Dec  1 23:20:42 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=f5f9f5ed-48e9-4255-9685-672e00971ebb /boot                   xfs     defaults  0 0
#/dev/mapper/centos-swap swap                    swap    defaults        0 0

[root@master ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.8G        228M        1.3G        9.5M        295M        1.4G
Swap:            0B          0B          0B

1.6、配置时间同步
所有节点安装chrony服务

[root@master ~]# yum install -y chrony

master节点修改/etc/chrony.conf文件,注释默认NTP服务器,指定上游公共NTP服务器,并允许其它节点同步时间

[root@node ~]# sed -i 's/^server/#&/' /etc/chrony.conf
然后再追加以下内容
local stratum 10
server master iburst
allow all

maseter节点重启chronyd服务并设为开机启动,开启网络时间同步功能。

[root@master ~]# systemctl enable chronyd && systemctl restart chronyd

node节点修改/etc/chrony.conf文件,指定内网master节点为上游NTP服务器,重启服务并设为开机启动。

[root@node ~]# sed -i 's/^server/#&/' /etc/chrony.conf
[root@node ~]# echo server 192.168.200.10 iburst >> /etc/chrony.conf
[root@node ~]# systemctl enable chronyd && systemctl restart chronyd

所有节点执行chronyc sources命令,查询结果中如果存在以“^*”开头的行,即说明已经同步成功。

[root@master ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* master                       10   6   377   316     -6ns[  -12us] +/-   17us

[root@node ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* master                       11   6    77    12  -5670ns[  -22us] +/- 6071us

1.7、配置路由转发
RHEL/CentOS上的一些用户报告了由于iptables被绕过而导致流量路由不正确的问题,所以需要在各个节点开启路由转发。
所有节点创建/etc/sysctl.d/k8s.conf文件,添加如下内容。

[root@master ~]# vi /etc/sysctl.d/k8s.conf
[root@master ~]# cat /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

[root@master ~]# modprobe br_netfilter
[root@master ~]# sysctl -p /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

1.8、配置IPVS
由于IPVS已经加入到了内核的主干,所以为kube-proxy开启IPVS的前提需要加载以下内核模块。

所有节点执行以下操作。

[root@master ~]# vi /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

[root@master ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
nf_conntrack_ipv4      15053  0
nf_defrag_ipv4         12729  1 nf_conntrack_ipv4
ip_vs_sh               12688  0
ip_vs_wrr              12697  0
ip_vs_rr               12600  0
ip_vs                 145458  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack          139264  2 ip_vs,nf_conntrack_ipv4
libcrc32c              12644  3 xfs,ip_vs,nf_conntrack

以上脚本创建了/etc/sysconfig/modules/ipvs.modules文件,保证在节点重启后能自动加载所需模块。使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已经正确加载所需的内核模块。

所有节点安装ipset软件包。

[root@master ~]# yum install ipset ipvsadm -y

1.9、安装Docker
Kubernetes默认的容器运行时仍然是Docker,使用Kubelet中内置dockershim CRI实现。需要注意的是,由于在Kubernetes1.14版本中,支持的版本有1.13.1、17.03、17.06、17.09、18.06和18.09,所以这里统一使用Docker 18.09。

所有节点配置Docker Yum源并安装Docker,启动Docker引擎并设置开机自启,步骤参考Docker引擎安装的2.2及之后步骤。

我们安装的docker使用的文件驱动是systemd,需要文件驱动由默认systemd改成cgroupfs,否则造成驱动不一致, 导致镜像无法启动。

[root@master ~]# cat /etc/docker/daemon.json
{
	"exec-opts":["native.cgroupdriver=systemd"]
}

[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart docker
[root@master ~]# systemctl enable docker
[root@master ~]# ./kubernetes_base.sh
[root@master ~]# docker info | grep Cgroup
Cgroup Driver: systemd

2、安装Kubernetes集群

2.1、配置Kubernetes Yum源
所有节点配置Kubernetes源。Kubernetes源可以采用下面的网络源,也可以采用上述配置的本地Yum源。

[root@master ~]# cat /etc/yum.repos.d/local.repo
[kubernetes]
name=kubernets
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
enable=1
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

2.2、安装工具
Kubelet负责与其它节点集群通信,并进行本节点Pod和容器生命周期的管理。Kubeadm是Kubernetes的自动化部署工具,降低了部署难度,提高效率。Kubectl是Kubernetes集群管理工具。

所有节点安装Kubernetes工具并启动Kubeket。

[root@master ~]# yum install kubelet-1.14.1 kubeadm-1.14.1 kubectl-1.14.1 -y
[root@master ~]# systemctl enable kubelet && systemctl start kubelet
#现在启动不成功是正常的,稍后初始化的时候会变成功

2.3、初始化Kubernetes集群
登录master节点,初始化Kubernetes集群。
–pod-network-cidr=10.16.0.0/16的参数值IP段为下文步骤2.4中kube-flannel.yml文件的网络配置参数,注意一致性。

[root@master ~]# kubeadm init --apiserver-advertise-address 192.168.200.10 --kubernetes-version="v1.14.1" --pod-network-cidr=10.16.0.0/16 --image-repository=registry.aliyuncs.com/google_containers

...省略
Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.200.10:6443 --token jakivb.3ih0a5kectmd2djz \
    --discovery-token-ca-cert-hash sha256:f1452f22b3e2c78a4ca8365de13c379c7189deeaf84ffb7a4f27650b9ecf824a
    #此行报文需记录,用于node节点加入集群

初始化操作主要经历了以下15个步骤,每个阶段均输出使用[步骤名称]作为开头:

  1. [init]:指定版本进行初始化操作。
  2. [preflight]:初始化前的检查和下载所需要的Docker镜像文件。
  3. [kubelet-start]:生成Kubelet的配置文件/var/lib/kubelet/config.yaml,没有这个文件Kubelet无法启动,所以初始化之前的Kubelet实际上启动失败。
  4. [certs]:生成Kubernetes使用的证书,存放在/etc/kubernetes/pki目录中。
  5. [kubeconfig]:生成KubeConfig文件,存放在/etc/kubernetes目录中,组件之间通信需要使用对应文件。
  6. [control-plane]:使用/etc/kubernetes/manifests目录下的YAML文件,安装Master组件。
  7. [etcd]:使用/etc/kubernetes/manifests/etcd.yaml安装Etcd服务。
  8. [wait-control-plane]:等待control-plan部署的Master组件启动。
  9. [apiclient]:检查Master组件服务状态。
  10. [upload-config]:更新配置。
  11. [kubelet]:使用configMap配置Kubelet
  12. [upload-certs]:更新CNI信息到Node上,通过注释的方式记录。
  13. [mark-control-plane]:为当前节点打标签,打了角色Master,和不可调度标签,这样默认就不会使用Master节点来运行Pod。
  14. [bootstrap-token]:生成的Token需要记录下来,后面使用Kubeadm join命令往集群中添加节点时会用到。如:Using token: x4yoij.pnyisq7ursn2zwmk
  15. [addons]:安装附加组件CoreDNSkube-proxy。提示如何配置常规用户使用kubectl访问集群。 提示如何安装 Pod 网络。 提示如何注册其他节点到 Cluster。

额外知识补充:依照 kubeadm init 输出的最后提示,推荐用 Linux 普通用户执行 kubectl。

#创建普通用户并设置密码123456
useradd centos && echo "centos:123456" | chpasswd centos

#追加sudo权限,并配置sudo免密
sed -i '/^root/a\centos  ALL=(ALL)       NOPASSWD:ALL' /etc/sudoers

#保存集群安全配置文件到当前用户.kube目录
su - centos
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

#启用 kubectl 命令自动补全功能(注销重新登录生效)
echo "source <(kubectl completion bash)" >> ~/.bashrc

【也可跳过上述配置,直接用root访问kubectl】
Kubectl默认会在执行的用户home目录下面的.kube目录下寻找config文件,配置Kubectl工具。

[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

检查集群状态

[root@master ~]# kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
controller-manager   Healthy   ok
scheduler            Healthy   ok
etcd-0               Healthy   {"health":"true"}

2.4、配置Kubernetes网络
要让 Kubernetes Cluster 能够工作,必须安装 Pod 网络,否则 Pod 之间无法通信。 Kubernetes 支持多种网络方案,这里我们使用 flannel 执行如下步骤部署 flannel:

登录Master节点,将提供kube-flannel.yml文件上传至Master节点root目录,使用kubectl apply命令安装网络。(ps:kube-flannel.yml这个插件文件可以自行下载-需要梯子,更多解释参考这篇文章)
倘若上述方法都行不通,可以直接新建该文件,然后编写内容如下:

---
kind: Namespace
apiVersion: v1
metadata:
  name: kube-flannel
  labels:
    k8s-app: flannel
    pod-security.kubernetes.io/enforce: privileged
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    k8s-app: flannel
  name: flannel
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes/status
  verbs:
  - patch
- apiGroups:
  - networking.k8s.io
  resources:
  - clustercidrs
  verbs:
  - list
  - watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    k8s-app: flannel
  name: flannel
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: flannel
subjects:
- kind: ServiceAccount
  name: flannel
  namespace: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: flannel
  name: flannel
  namespace: kube-flannel
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: kube-flannel-cfg
  namespace: kube-flannel
  labels:
    tier: node
    k8s-app: flannel
    app: flannel
data:
  cni-conf.json: |
    {
      "name": "cbr0",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "flannel",
          "delegate": {
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        },
        {
          "type": "portmap",
          "capabilities": {
            "portMappings": true
          }
        }
      ]
    }
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds
  namespace: kube-flannel
  labels:
    tier: node
    app: flannel
    k8s-app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/os
                operator: In
                values:
                - linux
      hostNetwork: true
      priorityClassName: system-node-critical
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni-plugin
        image: docker.io/flannel/flannel-cni-plugin:v1.2.0
        command:
        - cp
        args:
        - -f
        - /flannel
        - /opt/cni/bin/flannel
        volumeMounts:
        - name: cni-plugin
          mountPath: /opt/cni/bin
      - name: install-cni
        image: docker.io/flannel/flannel:v0.22.3
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
        image: docker.io/flannel/flannel:v0.22.3
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
            add: ["NET_ADMIN", "NET_RAW"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: EVENT_QUEUE_DEPTH
          value: "5000"
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
        - name: xtables-lock
          mountPath: /run/xtables.lock
      volumes:
      - name: run
        hostPath:
          path: /run/flannel
      - name: cni-plugin
        hostPath:
          path: /opt/cni/bin
      - name: cni
        hostPath:
          path: /etc/cni/net.d
      - name: flannel-cfg
        configMap:
          name: kube-flannel-cfg
      - name: xtables-lock
        hostPath:
          path: /run/xtables.lock
          type: FileOrCreate
[root@master ~]# cp yaml/kube-flannel.yaml ./
[root@master ~]# kubectl apply -f kube-flannel.yaml
[root@master ~]# kubectl get pods -n kube-system
NAME                             READY   STATUS    RESTARTS   AGE
coredns-8686dcc4fd-htr62         1/1     Running   0          107s
coredns-8686dcc4fd-mvsnd         1/1     Running   0          107s
etcd-master                      1/1     Running   0          41s
kube-apiserver-master            1/1     Running   0          55s
kube-controller-manager-master   1/1     Running   0          57s
kube-flannel-ds-amd64-plq67      1/1     Running   0          24s
kube-proxy-qfkv2                 1/1     Running   0          107s
kube-scheduler-master            1/1     Running   0          65s

可以看到,所有的系统 Pod 都成功启动了,而刚刚部署的flannel网络插件则在 kube-system 下面新建了一个名叫kube-flannel-ds-amd64-plq67的 Pod,一般来说,这些 Pod 就是容器网络插件在每个节点上的控制组件。 Kubernetes 支持容器网络插件,使用的是一个名叫 CNI 的通用接口,它也是当前容器网络的事实标准,市面上的所有容器网络开源项目都可以通过 CNI 接入 Kubernetes,比如 Flannel、Calico、Canal、Romana 等等,它们的部署方式也都是类似的“一键部署”。至此,Kubernetes 的 Master 节点就部署完成了。如果你只需要一个单节点的 Kubernetes,现在你就可以使用了。不过,在默认情况下,Kubernetes 的 Master 节点是不能运行用户Pod的。

2.5、Node节点加入集群
KubernetesWorker节点Master节点几乎是相同的,它们运行着的都是一个kubelet组件。唯一的区别在于,在kubeadm init的过程中,kubelet 启动后,Master 节点上还会自动运行kube-apiserverkube-schedulerkube-controller-manger这三个系统 Pod

登录Node节点,使用kubeadm join命令将Node节点加入集群。

#ps:如果之前执行kubeadm init时没有记录下加入集群的指令,可以在master节点上使用以下命令查询
#kubeadm token create --print-join-command --ttl 0
#或者通过以下命令重新创建加入指令
#kubeadm token create --print-join-command

[root@node ~]# kubeadm join 192.168.200.10:6443 --token jakivb.3ih0a5kectmd2djz \
    --discovery-token-ca-cert-hash sha256:f1452f22b3e2c78a4ca8365de13c379c7189deeaf84ffb7a4f27650b9ecf824a

...省略
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

登录Master节点,检查各节点状态。
等所有的节点都已经ReadyKubernetes Cluster创建成功,一切准备就绪。如果Pod的状态为PendingContainerCreatingImagePullBackOff都表明Pod没有就绪,Running才是就绪状态。 如果有Pod提示Init:ImagePullBackOff,说明这个Pod的镜像在对应节点上拉取失败,我们可以通过kubectl describe pod -n <命名空间> 查看 Pod 具体情况。Kubernetes K8S之kubectl命令详解及常用示例

[root@master ~]# kubectl get pod --all-namespaces -o wide
NAMESPACE     NAME                                    READY   STATUS    RESTARTS   AGE IP               NODE     NOMINATED NODE   READINESS GATES
kube-system   coredns-8686dcc4fd-htr62                1/1     Running   0          16h 10.16.0.2        master   <none>           <none>
kube-system   coredns-8686dcc4fd-mvsnd                1/1     Running   0          16h 10.16.0.3        master   <none>           <none>
kube-system   etcd-master                             1/1     Running   0          16h 192.168.200.10   master   <none>           <none>
kube-system   kube-apiserver-master                   1/1     Running   0          16h 192.168.200.10   master   <none>           <none>
kube-system   kube-controller-manager-master          1/1     Running   0          16h 192.168.200.10   master   <none>           <none>
kube-system   kube-flannel-ds-amd64-plq67             1/1     Running   0          16h 192.168.200.10   master   <none>           <none>
kube-system   kube-flannel-ds-amd64-x9s7t             1/1     Running   0          16h 192.168.200.20   node     <none>           <none>
kube-system   kube-proxy-d529t                        1/1     Running   0          16h 192.168.200.20   node     <none>           <none>
kube-system   kube-proxy-qfkv2                        1/1     Running   0          16h 192.168.200.10   master   <none>           <none>
kube-system   kube-scheduler-master                   1/1     Running   0          16h 192.168.200.10   master   <none>           <none>
kube-system   kubernetes-dashboard-5f7b999d65-4d7qh   1/1     Running   0          16h 10.16.1.2        node     <none>           <none>
kube-system   kuboard-84979d978d-sgp6j                1/1     Running   0          15h 10.16.1.3        node     <none>           <none>

[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES    AGE     VERSION
master   Ready    master   4m48s   v1.14.1
node     Ready    <none>   33s     v1.14.1

2.6、安装Dashboard
将提供的kubernetes-dashboard.yamldashboard-adminuser.yaml文件上传至Master节点root目录,使用kubectl apply命令安装Dashboard。

[root@master ~]# cp yaml/kubernetes-dashboard.yaml ./
[root@master ~]# cp yaml/dashboard-adminuser.yaml ./
[root@master ~]# kubectl apply -f kubernetes-dashboard.yaml
[root@master ~]# kubectl apply -f dashboard-adminuser.yaml

检查所有Pod状态。可以通过 kubectl 检查这个节点上各个系统 Pod 的状态,其中,kube-system 是 Kubernetes 项目预留的系统 Pod 的工作空间(Namepsace,注意它并不是 Linux Namespace,它只是 Kubernetes 划分不同工作空间的单位)
集群初始化如果遇到问题,可以使用kubeadm reset命令进行清理然后重新执行初始化。Pending 状态,即调度失败。)

#这里Dashboard的容器启动需要
[root@master ~]# kubectl get pods --all-namespaces -o wide
NAMESPACE     NAME                                    READY   STATUS    RESTARTS   AGE     IP               NODE     NOMINATED NODE   READINESS GATES
kube-system   coredns-8686dcc4fd-htr62                1/1     Running   0          3m22s   10.16.0.2        master   <none>           <none>
kube-system   coredns-8686dcc4fd-mvsnd                1/1     Running   0          3m22s   10.16.0.3        master   <none>           <none>
kube-system   etcd-master                             1/1     Running   0          2m16s   192.168.200.10   master   <none>           <none>
kube-system   kube-apiserver-master                   1/1     Running   0          2m30s   192.168.200.10   master   <none>           <none>
kube-system   kube-controller-manager-master          1/1     Running   0          2m32s   192.168.200.10   master   <none>           <none>
kube-system   kube-flannel-ds-amd64-plq67             1/1     Running   0          119s    192.168.200.10   master   <none>           <none>
kube-system   kube-flannel-ds-amd64-x9s7t             1/1     Running   0          49s     192.168.200.20   node     <none>           <none>
kube-system   kube-proxy-d529t                        1/1     Running   0          49s     192.168.200.20   node     <none>           <none>
kube-system   kube-proxy-qfkv2                        1/1     Running   0          3m22s   192.168.200.10   master   <none>           <none>
kube-system   kube-scheduler-master                   1/1     Running   0          2m40s   192.168.200.10   master   <none>           <none>
kube-system   kubernetes-dashboard-5f7b999d65-4d7qh   1/1     Running   0          18s     10.16.1.2        node     <none>           <none>

通过命令检查到kubernetes-dashboard被调度到Node节点运行,通过浏览器中输入Node节点地址(Master也可以访问)https://IP:30000(默认Dashboard只能集群内部访问,修改kubernetes-dashboard.yaml文件中的Service为NodePort类型,并暴露端口到外部30000),即可访问Kubernetes Dashboard,如下图所示:
实战案例-原生Kubernetes云平台部署_第1张图片
登录Kubernetes Dashboard需要输入令牌,通过以下命令获取访问令牌Dashboard的认证令牌

[root@master ~]# kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kubernetes-dashboard-admin-token | awk '{print$1}')
Name:         kubernetes-dashboard-admin-token-n4rfs
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: kubernetes-dashboard-admin
              kubernetes.io/service-account.uid: e9e73695-800d-11ee-a6c2-000c29f60dca

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC1hZG1pbi10b2tlbi1uNHJmcyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC1hZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImU5ZTczNjk1LTgwMGQtMTFlZS1hNmMyLTAwMGMyOWY2MGRjYSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJlcm5ldGVzLWRhc2hib2FyZC1hZG1pbiJ9.SSKTSzH9AU8lSTfoToXy7s8WdwSAj0q2EDUnbbShwFCO0GORWyBd7HUIj8bGAjzvSaQ4cP3oP0oWLYXl0egcPu73SB21Lt_8gALYI2hADgzuKSgzH4rmObcmDxUpKp7TEI7pXYRHfbb4FUn2lcosy4tMN1zPWfrOfoF1dOT-pRl0E4gF6JlxPYrYNmPoUKs8O-DxYsZudV2GAfOeXXHAhOXUiOVl9G6sXI3-EB43xgLbno4Z2bbYF8aetatVoUZs8EQK1dfnPwvwBGnuz8QNcp-4w5qX3sqGFd1TMPq3U8LToxHRiPmLHouXNjHUELKwghwAyMB-sYydOecz8-jWlg

使用正确token成功登录后控制面板如图所示:
实战案例-原生Kubernetes云平台部署_第2张图片

2.7、配置Kuboard
Kuboard是一款免费的Kubernetes图形化管理工具,其力图帮助用户快速在Kubernetes上落地微服务。登录Master节点,使用kuboard.yaml文件部署Kuboard。

[root@master ~]# cp yaml/kuboard.yaml ./
[root@master ~]# kubectl create -f kuboard.yaml

在浏览器输入地址http://192.168.200.10:31000,即可进入Kuboard的认证界面,在Token文本框中输入令牌(上述令牌)后可进入Kuboard控制台,如图所示:

输入令牌
实战案例-原生Kubernetes云平台部署_第3张图片

登录成功
实战案例-原生Kubernetes云平台部署_第4张图片
在Kuboard控制台中可以查看到集群概览,至此Kubernetes容器云平台就部署完成了!

你可能感兴趣的:(Docker,k8s,kubernetes,docker)