快速部署kubernetes环境

1. Kubernetes介绍

1.1 Kubernetes简介

首先,他是一个全新的基于容器技术的分布式架构领先方案。Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg)。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。  Kubernetes是一个完备的分布式系统支撑平台,具有完备的集群管理能力,多扩多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、內建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制以及多粒度的资源配额管理能力。同时Kubernetes提供完善的管理工具,涵盖了包括开发、部署测试、运维监控在内的各个环节。以下简称k8s

1.2 Kubernetes优势

  • 容器编排

  • 轻量级

  • 开源

  • 弹性伸缩

  • 负载均衡

1.3 Kubernetes组件说明

下面的描述中,不懂的名词可以参阅: https://www.kubernetes.org.cn/kubernetes-services

1.3.1 Borg架构分析

k8s框架整体是非常庞大的,我们先了解一下k8s组件构成。k8s的前身为谷歌的Borg,k8s为Borg用go语言的重构版,k8s作为Borglet的精良版,我们先了解一下Borglet的架构。下图为Borg的架构图

 

上图主要有两部分组成BorgMaster和Borglet。BorgMaster主要负责接受请求进行请求的分发,为防止BorgMaster单节点故障,BorgMaster有很多副本。 的Borglet负责容器的运行及计算。同样Borglet也为多副本。

Borg支持多种请求方式,当请求进入BorgMaster以后,scheduler对请求进行分析,之后将数据写入BorgMaster的Paxos数据库中,Borglet监听Paxos,当有与之相关的数据时对数据进行处理。

1.3.2 Kubernetes 架构分析

分析完Borg之后,下图将介绍k8s的架构图

 

k8s做为Borglet的精良版,上图可以分为上半部分master节点,及下半部分node节点。从图中可以看出,当请求或者kubectl过来时,api server 拿到数据时,依然由scheduler调度器对数据进行分析,之后返回api server 将数据存储到Etcd,其中的replication controller 用来维护容器的期望值。如果副本的数量不满足期望值时,replication controller将副本数量申请到期望值。

node节点中kubelet会跟CRI(container runtime interface)进行交互。操作Docker创建容器。进行维持Pod的生命周期。 kube proxy完成负载均衡及Pod管理。 kube proxy默认操作对象是firewall(防火墙),实现Pod的映射。新版本还支持IPVS。

Etcd:官方将Etcd定位成一个可信赖的分布式键值存储服务,它能为整个分布式集群存储一些关键数据,协助分布式集群的正常运转。k8s集群中使用Etcd v3 ,v2版本已经在k8s v1.11中弃用。v2会将所有数据全部写入内存中。v3会将部分数据写入到本地的数据卷中。v3版不会造成数据损坏。会从本地磁盘进行恢复。k8s v1.11之前版本则要对Etcd进行数据备份操作。

综上分析,各个组件的作用为:

api server: 所有服务访问统一入口

replication controller:维持副本期望数目

scheduler:负责任务处理,及分配合适的处置节点进行处置

Etcd:键值对数据库。存储k8s集群重要信息

kubelet:直接跟容器引擎进行交互实现容器生命周期管理

kube proxy: 负责写入规则至 IPTABLES, IPVS 实现服务访问映射。

其他插件:

CoreDNS: 可以为集群中的SVC创建一个域名IP的对应关系解析

Dashboard: 为k8s集群提供一个B/S结构访问体系

Ingress Controller: 官方只能实现四层代理,Ingress 可以实现七层代理

Fedetation: 提供一个可以跨集群中心多K8S统一管理功能

Prometheus: 提供k8s集群的监控能力

ELK: 提供k8s日志统一分析介入平台

2. Kubernetes 基础概念

2.1 Pod概念

  •  什么是Pod

• 一组容器的一个“单一集合体”

• K8s中的最小任务调度单元 • 可以被调度到任意Node上恢复

• 一个Pod里的所有容器共享资源 (网络、Volumes)

  • Pod分类

自主式Pod:非控制器管理的Pod,这种Pod发生意外不会被重新启用

控制器管理的Pod:控制器管理的Pod在生命周期范围内会被重新构建起来

  •  Pod 控制器类型

  1. ReplicationController

    用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建Pod来替代;而由于异常多出来的容器也会自动回收。

    在新版本k8s中建议使用Replicaset 来取代ReplicationController

  2. ReplicaSet

    ReplicaSetReplicationController没有本质的区别,ReplicaSet支持集合式selector

    虽然 ReplicaSet可以独立使用,但是一般还是建议使用Deployment来自动管理ReplicaSet,这样就无需担心与其他机制的不兼容内容(eg:ReplicaRet不支持rolling-update但Deployment支持)

  3. Deployment

    Deployment不直接操作Pod。Deployment在创建时会创建ReplicaSetReplicaSet负责创建Pod.当Pod需要改变时,Deployment会滚动新建ReplicaSet,来更新Pod。

  4. StatefulSet

    StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为无状态服务而设计),其应用场景包括

    • 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现

    • 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现

    • 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现

    • 有序收缩,有序删除(即从N-1到0)

  5. DaemonSet

    DaemonSet确保全部(或者一些)Node上运行一个Pod的副本。当有Node加入集群时,也会为其新增一个Pod。当有Node从集群中移除时,这些Pod也会被回收。删除DaemonSet将会删除它创建的所有Pod。

    使用DaemonSet的一些典型用法:

    • 运行集群存储daemon,例如在每个Node上运行glusterd,ceph。

    • 在每个Node上运行日志收集daemon,例如fluented,logstash。

    • 在每个Node上运行监控daemon,例如 Prometheus Node Exproter。

  6. Job, Cron Job

    Job: 负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。

    Corn Job: 管理基于时间的Job,即:

    • 在给定的时间点只运行一次

    • 周期性地在给定时间点运行

2.2 网络通讯方式

k8s的网络模型假定了多有的Pod都在一个可以直接连通的扁平的网络空间中,这在GCE(Google Compute Engine)里面是现成的网络模型,k8s假定这个网络模型已经存在。而在私有云里搭建k8s集群,就不能假定这个网络已经存在。我们需要实现这个假定网络,将不同节点的Docker容器之间的互通访问打通,然后运行k8s。

  • 同一个Pod内的多个容器之间:IO

  • 各Pod之间的通讯:Overlay Network

  • Pod与Service之间的通讯:各节点的Iptables规则,新版中使用了lVS机制进行转发。

 2.2.1 Overlay Network的实现

为解决不同节点之间容器中通过ip进行通信,Flannel提供了解决方案

Flannel是CoreOs团队针对k8s设计的一个网络规划服务,简单来说。它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。而且它还能在这些IP地址之间建立一个覆盖网络(Overlay Network),通过这个覆盖网络,将数据包原封不动的传递到目标容器内。

Flannel的解决方式

 

如上图所示,在Node中我们会安装一个flanneld的守护进程,flanneld开启以后,会开启Flannel0的一个网桥,Flannel0收集Docker0的数据报文,Docker0分配自己的ip到Pod上面。如果为同一台主机的不同Pod,连通方式为Docker0的网桥请求转发。当为不同主机时,跨主机访问时,数据从源头发出,flanneld会从etcd中找出目标主机信息,然后将数据信息进行封装发送到目标主机,目标主机的flanneld拿到数据对数据进行解析以后,通过不同的目标信息将数据分发到对应ip。

综上所述k8s网络访问方式总结:

  • 同一个Pod内部通讯:同一个Pod共享同一个网络命名空间,其享同一个 Linux协议栈

  • Podl至Pod2

Podl与Pod2不在同一台主机,Pod的地址是与 Docker0在同一个网段的,但 Docker0网段与宿主机网卡是两个完全不同的IP网段,并且不同Node之间的通信只能通过宿主机的物理网卡进行。将Pod的IP和所在Node的IP关联起来,通过这个关联让Pod可以互相访问

Podl与Pod2在同一台机器,由 Docker0网桥直接转发请求至Pod2,不需要经过 Flannel演示

  • Pod至 Service的网络:目前基于性能考虑,全部为 LVS维护和转发(旧版为iptables)

  • Pod到外网:Pod向外网发送请求,查找路由表,转发数据包到宿主机的网卡,宿主网卡完成路由选择后, iptables执行 Masquerade,把源IP更改为宿主网卡的IP,然后向外网服务器发送请求

  • 外网访问Pod: Service

3. 实操篇之K8S安装及配置

3.1  系统的安装及初始化

安装配置虚拟机时的过程略过,每台虚拟机配置两种网络模式NAT和仅主机模式

  1. 安装之前的初始化

$ yum install git wget zsh vim

2.使用oh my zsh 关键字在浏览器中搜索,从GitHub 中找到以下指令进行修改

$ sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

3.安装完成之后对皮肤进行修改

$ vim  .zshrc
# 修改其中的属性
ZSH_THEHE="bira"
$ source .zshrc

3.2 k8s集群环境安装步骤

3.2.2  基本环境配置

  1. 关闭selinux

    $ setenforce 0
    $ vim /etc/selinux/config
    # 将SELINUX的值改为disabled  SELINUX=disabled

     

  2. 关闭swap分区或禁用swap文件

#注释掉交换部分的代码  /dev/mapper/centos_k8s--mast...
$vim /etc/fstab
# # /dev/mapper/centos_k8s--master-swap swap                    swap    defaults        0 0
# 临时关闭
$ swapoff -a

     3 .  修改网卡配置

$ vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
$ sysctl -p

      4.  启用内核模块

#编辑此文件,可能不存在新建即可
$ vim /etc/sysconfig/modules/ipvs.modules
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
# 启用配置
$ modprobe -- ip_vs
$ modprobe -- ip_vs_rr
$ modprobe -- ip_vs_wrr
$ modprobe -- ip_vs_sh
$ modprobe -- nf_conntrack_ipv4
#验证是否生效
$ cut -f1 -d " "  /proc/modules | grep -e ip_vs -e nf_conntrack_ipv4

        5. 关闭防火墙

$ systemctl stop firewalld
$ systemctl disable firewalld

3.3 kubectl、kubeadm、kubelet的安装

3.3.1 添加Kubernetes的yum源

此处使用alibaba的镜像源

# 编辑安装源
$vim /etc/yum.repos.d/kubernetes.repo
# 文件内容
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg               http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

3.3.2 安装kubelet、kubeadm、kubectl

$ yum install -y kubelet kubeadm kubectl

3.3.3 启动kubelet服务

$ systemctl enable kubelet
$ systemctl start kubelet

此时执行systemctl status kubelet查看服务状态,服务状态应为Error(255), 如果是其他错误可使用journalctl -xe查看错误信息。

4. Docker安装和配置

4.1 Docker安装

docker的安装请查看官网文档: https://docs.docker.com/install/overview/

安装详情请参考官网

4.1.1 Docker配置

  1. 配置cgroup-driver为systemd

    # 查看cgroup-driver
    $ docker info | grep -i cgroup
     Cgroup Driver: cgroupfs

    由于k8s支持的默认驱动非cgroupfs,所以我们需要修改为默认驱动与k8s一致

    第一种方式

    # 追加 --exec-opt native.cgroupdriver=systemd 参数
    $ /usr/lib/systemd/system/docker.service
    # 在第14行代码 后面追加
    # 14 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd
    $ systemctl daemon-reload # 重新加载服务
    $ systemctl enable docker # 启用docker服务(开机自起)
    $ systemctl restart docker # 启动docker服务

    第二种方式

    # 或者修改docker配置文件
    $ vim /etc/docker/daemon.json
    { 
    "exec-opts": ["native.cgroupdriver=systemd"]
    }
    # 重新启动docker
    $ systemctl restart docker

     

  2. 预先拉取所需镜像

    # 查看kubeadm所需镜像
    $ kubeadm config images list
    k8s.gcr.io/kube-apiserver:v1.17.0
    k8s.gcr.io/kube-controller-manager:v1.17.0
    k8s.gcr.io/kube-scheduler:v1.17.0
    k8s.gcr.io/kube-proxy:v1.17.0
    k8s.gcr.io/pause:3.1
    k8s.gcr.io/etcd:3.4.3-0
    k8s.gcr.io/coredns:1.6.5
    # 拉取镜像
    $ docker pull kubeimage/kube-apiserver-amd64:v1.17.0
    $ docker pull kubeimage/kube-controller-manager-amd64:v1.17.0
    $ docker pull kubeimage/kube-scheduler-amd64:v1.17.0
    $ docker pull kubeimage/kube-proxy-amd64:v1.17.0
    $ docker pull kubeimage/pause-amd64:3.1
    $ docker pull kubeimage/etcd-amd64:3.4.2-0
    $ docker pull coredns/coredns:1.6.6

     

  3. 对预先拉取的镜像重新打tag

    $ docker tag kubeimage/kube-apiserver-amd64:v1.17.0  k8s.gcr.io/kube-apiserver:v1.17.0
    $ ddocker tag kubeimage/kube-controller-manager-amd64:v1.17.0 k8s.gcr.io/kube-controller-manager:v1.17.0
    $ docker tag kubeimage/kube-scheduler-amd64:v1.17.0 k8s.gcr.io/kube-scheduler:v1.17.0 
    $ docker tag kubeimage/kube-proxy-amd64:v1.17.0 k8s.gcr.io/kube-proxy:v1.17.0
    $ docker tag kubeimage/pause-amd64:3.1 k8s.gcr.io/pause:3.1
    $ docker tag kubeimage/etcd-amd64:3.4.2-0 k8s.gcr.io/etcd:3.4.2-0
    $ docker tag coredns/coredns:1.6.6 k8s.gcr.io/coredns:1.6.6

    4.删除未改名之前的镜像

    $ docker rmi kubeimage/kube-apiserver-amd64:v1.17.0
    $ docker rmi kubeimage/kube-controller-manager-amd64:v1.17.0
    $ docker rmi kubeimage/kube-scheduler-amd64:v1.17.0
    $ docker rmi kubeimage/kube-proxy-amd64:v1.17.0
    $ docker rmi kubeimage/pause-amd64:3.1
    $ docker rmi kubeimage/etcd-amd64:3.4.2-0
    $ docker rmi coredns/coredns:1.6.6
    5. 对host进行配置
$ vim etc/hosts
192.168.64.10 k8s-master
192.168.64.20 k8s-node1
192.168.64.21 k8s-node2

至此为止我们只要复制master服务即可完成安装node1跟node2,修改ip配置及名称配置即可。

以上步骤需要在node节点和master节点执行,当前步骤仅需在master节点执行。

4.2 Master节点的初始化

# 初始化master节点,
# --pod-network-cidr=192.168.0.0/16 指定使用Calico网络
# --pod-network-cidr=192.244.0.0/16 指定使用flannel网络
#上述网络可以二选一, flannel较为简单,文档内使用了flannel
# --apiserver-advertise-address=10.0.0.5 指向master节点IP,此处也可以使用hosts
$ kubeadm init --pod-network-cidr=10.244.0.0/16 \  
--kubernetes-version=v1.16.3 \  
--apiserver-advertise-address=10.0.0.5

执行上述命令的输出为:

W0108 00:38:54.336940   48475 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0108 00:38:54.337025   48475 validation.go:28] Cannot validate kubelet config - no validator is available
[init] Using Kubernetes version: v1.17.0
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [k8s-master kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.64.10]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [k8s-master localhost] and IPs [192.168.64.10 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [k8s-master localhost] and IPs [192.168.64.10 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
W0108 00:39:31.388440   48475 manifests.go:214] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC"
[control-plane] Creating static Pod manifest for "kube-scheduler"
W0108 00:39:31.389992   48475 manifests.go:214] the default kube-apiserver authorization-mode is "Node,RBAC"; using "Node,RBAC"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[kubelet-check] Initial timeout of 40s passed.
^[[D[apiclient] All control plane components are healthy after 137.596225 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config-1.17" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node k8s-master as control-plane by adding the label "node-role.kubernetes.io/master=''"
[mark-control-plane] Marking the node k8s-master as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
[bootstrap-token] Using token: wq1d08.oax1679f016eo5ns
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
​
Your Kubernetes control-plane has initialized successfully!
​
To start using your cluster, you need to run the following as a regular user:
​
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
​
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/
​
Then you can join any number of worker nodes by running the following on each as root:
​
kubeadm join 192.168.64.10:6443 --token wq1d08.oax1679f016eo5ns \
    --discovery-token-ca-cert-hash sha256:69c47e2f1aee50b62db3487b59931308b6693185c8a45099099808a80c15ce03 
​

上面代码中提示我们需要

 $ mkdir -p $HOME/.kube
 $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 $ sudo chown $(id -u):$(id -g) $HOME/.kube/config

查看node节点

kubectl get nodes -o wide

此处使用kubeadm token create --print-join-command指令

$ kubeadm token create --print-join-command
kubeadm join k8s-master:6443 --token vtf7im.fq4c3ktuaz7je0dp     --discovery-token-ca-cert-hash sha256:69c47e2f1aee50b62db3487b59931308b6693185c8a45099099808a80c15ce03
$ kubeadm join k8s-master:6443 --token vtf7im.fq4c3ktuaz7je0dp     --discovery-token-ca-cert-hash sha256:69c47e2f1aee50b62db3487b59931308b6693185c8a45099099808a80c15ce03

我们将上述获得的结果输入各个node节点,如果在配置好网络以后执行

watch kubectl get pods --all-namespaces -o wide

我们就会看见网络插件pod在其中生成

4.3 flannel网络插件的配置

Calico的官方文档地址为: https://github.com/coreos/flannel 。 具体安装步骤:

  1. 安装flannel

    $ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

     

  2. 监听安装进度

    $ watch kubectl get pods --all-namespaces

     

出现以下内容时为安装成功

NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE
kube-system   coredns-6955765f44-bk8q8             1/1     Running   0          31m
kube-system   coredns-6955765f44-t6j8b             1/1     Running   0          31m
kube-system   etcd-k8s-master                      1/1     Running   0          31m
kube-system   kube-apiserver-k8s-master            1/1     Running   0          31m
kube-system   kube-controller-manager-k8s-master   1/1     Running   1          31m
kube-system   kube-flannel-ds-amd64-74bvt          1/1     Running   0          56s
kube-system   kube-proxy-q26xp                     1/1     Running   0          31m
kube-system   kube-scheduler-k8s-master            1/1     Running   1          31m

 

  1. 测试

    $ kubectl get nodes -o wideNAME                STATUS     ROLES    AGE     VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION           CONTAINER-RUNTIMEkubernetes-master   Ready      master   4d12h   v1.16.3   192.168.56.101   <none>        CentOS Linux 7 (Core)   3.10.0-1062.el7.x86_64   docker://19.3.4

     

     

4.4 Node节点的初始化

  1. 登录node节点,执行加入集群的命令,完成加入集群操作

    $ kubeadm join 10.0.0.5:6443 --token kt58np.djd3youoqb0bnz4r \    --discovery-token-ca-cert-hash sha256:37a3924142dc6d57eac2714e539c174ee3b0cda723746ada2464ac9e8a2091ce

     

  2. 在master节点上查看添加结果

    $ kubectl get nodes -o wide

     

  3. 加入成功以后

$ watch kubectl get pods --all-namespaces
NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE     IP              NODE         NOMINATED NODE   READINESS GATES
kube-system   coredns-6955765f44-bk8q8             1/1     Running   0          62m     10.244.0.2      k8s-master   <none>           <none>
kube-system   coredns-6955765f44-t6j8b             1/1     Running   0          62m     10.244.0.3      k8s-master   <none>           <none>
kube-system   etcd-k8s-master                      1/1     Running   0          62m     192.168.64.10   k8s-master   <none>           <none>
kube-system   kube-apiserver-k8s-master            1/1     Running   0          63m     192.168.64.10   k8s-master   <none>           <none>
kube-system   kube-controller-manager-k8s-master   1/1     Running   4          62m     192.168.64.10   k8s-master   <none>           <none>
kube-system   kube-flannel-ds-amd64-74bvt          1/1     Running   0          32m     192.168.64.10   k8s-master   <none>           <none>
kube-system   kube-flannel-ds-amd64-jxf48          1/1     Running   0          3m15s   192.168.64.21   k8s-node2    <none>           <none>
kube-system   kube-flannel-ds-amd64-wwxdd          1/1     Running   0          3m13s   192.168.64.20   k8s-node1    <none>           <none>
kube-system   kube-proxy-llr6k                     1/1     Running   0          3m15s   192.168.64.21   k8s-node2    <none>           <none>
kube-system   kube-proxy-q26xp                     1/1     Running   0          62m     192.168.64.10   k8s-master   <none>           <none>
kube-system   kube-proxy-tzlm5                     1/1     Running   0          3m13s   192.168.64.20   k8s-node1    <none>           <none>
kube-system   kube-scheduler-k8s-master            1/1     Running   4          63m     192.168.64.10   k8s-master   <none>           <none>

当出现一下结果时说明部署已经成功了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值