Kubernetes技术已经成为了原生云技术的事实标准,它是目前基础软件领域最为热门的分布式调度和管理平台。于是,Kubernetes也几乎成了时下开发工程师和运维工程师必备的技能之一。
 
一、主机环境预设
 
1、测试环境说明
 
测试使用的Kubernetes集群可由一个master主机及一个以上(建议至少两个)node主机组成,这些主机可以是物理服务器,也可以运行于vmware、virtualbox或kvm等虚拟化平台上的虚拟机,甚至是公有云上的VPS主机。
 
本测试环境将由k8s-vm1、k8s-vm2和k8s-vm3三个独立的主机组成,它们分别拥有4核心的CPU及4G的内存资源,操作系统环境均为CentOS 7.6 1810,域名为dexter.com。此外,各主机需要预设的系统环境如下:
 
    (1)借助于NTP服务设定各节点时间精确同步;
    (2)通过DNS完成各节点的主机名称解析,测试环境主机数量较少时也可以使用hosts文件进行;
    (3)关闭各节点的iptables或firewalld服务,并确保它们被禁止随系统引导过程启动;
    (4)各节点禁用SELinux;
    (5)各节点禁用所有的Swap设备;
    (6)若要使用ipvs模型的proxy,各节点还需要载入ipvs相关的各模块;
    
2、设定时钟同步
    
    若节点可直接访问互联网,直接启动chronyd系统服务,并设定其随系统引导而启动。
    
        # systemctl start chronyd.service
        # systemctl enable chronyd.service        
    
    不过,建议用户配置使用本地的的时间服务器,在节点数量众多时尤其如此。存在可用的本地时间服务器时,修改节点的/etc/crhony.conf配置文件,并将时间服务器指向相应的主机即可,配置格式如下:
    
        server CHRONY-SERVER-NAME-OR-IP iburst
        
3、主机名称解析
 
出于简化配置步骤的目的,本测试环境使用hosts文件进行各节点名称解析,文件内容如下所示:
172.16.99.121 k8s-vm1.dexter.com k8s-vm1
172.16.99.122 k8s-vm2.dexter.com k8s-vm2
172.16.99.123 k8s-vm3.dexter.com k8s-vm3
 
4、关闭iptables或firewalld服务
 
在CentOS7上,iptables或firewalld服务通常只会安装并启动一种,在不确认具体启动状态的前提下,这里通过同时关闭并禁用二者即可简单达到设定目标。
 
    # systemctl stop firewalld.service
    # systemctl stop iptables.service
    # systemctl disable firewalld.service
    # systemctl disable iptables.service
 
5、关闭并禁用SELinux
 
若当前启用了SELinux,则需要编辑/etc/sysconfig/selinux文件,禁用SELinux,并临时设置其当前状态为permissive:
 
    # sed -i 's@^\(SELINUX=\).*@\1disabled@' /etc/sysconfig/selinux
    # setenforce 0
 
6、禁用Swap设备
 
部署集群时,kubeadm默认会预先检查当前主机是否禁用了Swap设备,并在未禁用时强制终止部署过程。因此,在主机内存资源充裕的条件下,需要禁用所有的Swap设备,否则,就需要在后文的kubeadm init及kubeadm join命令执行时额外使用相关的选项忽略检查错误。
 
关闭Swap设备,需要分两步完成。首先是关闭当前已启用的所有Swap设备:
# swapoff -a
        
而后编辑/etc/fstab配置文件,注释用于挂载Swap设备的所有行。
    
7、启用ipvs内核模块
 
创建内核模块载入相关的脚本文件/etc/sysconfig/modules/ipvs.modules,设定自动载入的内核模块。文件内容如下:
 
#!/bin/bash
ipvs_mods_dir="/usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs"
for mod in $(ls $ipvs_mods_dir | grep -o "^[^.]*"); do
    /sbin/modinfo -F filename $mod  &> /dev/null
    if [ $? -eq 0 ]; then
        /sbin/modprobe $mod
    fi
done
修改文件权限,并手动为当前系统加载内核模块:
# chmod +x /etc/sysconfig/modules/ipvs.modules
# bash /etc/sysconfig/modules/ipvs.modules  
 
8、开启透明网桥
# echo "net.bridge.bridge-nf-call-iptables=1" >> /etc/sysctl.conf
# echo "net.bridge.bridge-nf-call-ip6tables=1" >> /etc/sysctl.conf
# sysctl -p
 
 
二、安装程序包(在各主机上完成如下设定)
 
1、生成yum仓库配置
        
首先获取docker-ce的配置仓库配置文件:
 
 
注:ansible快速部署命令
# ansible k8s -m shell -a 'wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker.repo'   
         
配置k8s yum仓库
# cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
gpgcheck=1
enabled=1
EOF
 
 
注:ansible快速部署命令
# ansible k8s -m copy -a 'src=/tmp/kubernetes.repo dest=/etc/yum.repos.d/kubernetes.repo'
 
2、安装相关的程序包
 
Kubernetes会对经过充分验正的Docker程序版本进行认证,目前认证完成的最高版本是17.03,但docker-ce的最新版本已经高出了几个版本号。管理员可忽略此认证而直接使用最新版本的docker-ce程序,不过,建议根据后面的说明,将安装命令替换为安装17.03版。
# yum install docker-ce -y
# yum install kubelet-1.13.3   -y
# yum install kubeadm-1.13.3 kubectl-1.13.3  -y
如果要安装目前经过Kubernetes认证的docker-17版本,可以将上面第一条安装命令替换为如下命令:
# yum install -y --setopt=obsoletes=0 docker-ce-17.03.2.ce docker-ce-selinux-17.03.2.ce
 
注:ansible快速部署命令
# ansible k8s -m shell -a 'yum install -y --setopt=obsoletes=0 docker-ce-17.03.2.ce docker-ce-selinux-17.03.2.ce'
# ansible k8s -m yum -a 'name=kubelet-1.13.3 state=present'
# ansible k8s -m yum -a 'name=kubeadm-1.13.3 state=present'
# ansible k8s -m yum -a 'name=kubectl-1.13.3 state=present'
三、启动docker服务(在各节点执行)
 
若要通过默认的k8s.gcr.io镜像仓库获取Kubernetes系统组件的相关镜像,需要配置docker Unit File(/usr/lib/systemd/system/docker.service文件)中的Environment变量,为其定义合用的HTTPS_PROXY,格式如下:
    
    Environment="HTTPS_PROXY=PROTOCOL://HOST:PORT"
    Environment="NO_PROXY=172.16.0.0/16,127.0.0.0/8"
        
示范如下:
    Environment="HTTPS_PROXY=http://www.ik8s.io:10070"
    Environment="NO_PROXY=172.16.0.0/16,127.0.0.0/8"
另外,docker自1.13版起会自动设置iptables的FORWARD默认策略为DROP,这可能会影响Kubernetes集群依赖的报文转发功能,因此,需要在docker服务启动后,重新将FORWARD链的默认策略设备为ACCEPT,方式是修改/usr/lib/systemd/system/docker.service文件,在“ExecStart=/usr/bin/dockerd”一行之后新增一行如下内容:
    ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
        
[root@k8s-vm2 ~]# cat /usr/lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target firewalld.service
 
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
Environment="HTTPS_PROXY=http://www.ik8s.io:10070"
Environment="NO_PROXY=172.16.0.0/16,127.0.0.0/8"
ExecStart=/usr/bin/dockerd
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
 
[Install]
WantedBy=multi-user.target
重载完成后即可启动docker服务:
#systemctl daemon-reload        
# systemctl start docker.service
            
而后设定docker和kubelet随系统引导自动启动:
# systemctl enable docker kubelet
 
注:ansible快速部署命令
ansible k8s -m service -a 'name=docker state=started enabled=yes'
ansible k8s -m service -a 'name=kubelet state=started enabled=yes'
四、初始化主节点(在k8s-vm1上完成如下操作)
            
1、初始化master节点
 
若未禁用Swap设备,则需要编辑kubelet的配置文件/etc/sysconfig/kubelet,设置其忽略Swap启用的状态错误,内容如下:
    KUBELET_EXTRA_ARGS="--fail-swap-on=false"
    
(可选步骤)而后,在运行初始化命令之前先运行如下命令单独获取相关的镜像文件,而后再运行后面的kubeadm init命令,以便于观察到镜像文件的下载过程。
    # kubeadm config images pull
    
而后即可进行master节点初始化。kubeadm init命令支持两种初始化方式,一是通过命令行选项传递关键的部署设定,另一个是基于yaml格式的专用配置文件,后一种允许用户自定义各个部署参数。下面分别给出了两种实现方式的配置步骤,建议读者采用第二种方式进行。
 
初始化方式一:
 
运行如下命令完成k8s-vm1节点的初始化:
# kubeadm init --kubernetes-version=v1.13.3 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
# kubeadm init --kubernetes-version=v1.13.3 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --apiserver-advertise-address=172.16.99.121
命令中的各选项简单说明如下:
    (1) --kubernetes-version选项的版本号用于指定要部署的Kubenretes程序版本,它需要与当前的kubeadm支持的版本保持一致;
    (2) --pod-network-cidr选项用于指定分Pod分配使用的网络地址,它通常应该与要部署使用的网络插件(例如flannel、calico等)的默认设定保持一致,10.244.0.0/16是flannel默认使用的网络;
    (3) --service-cidr用于指定为Service分配使用的网络地址,它由kubernetes管理,默认即为10.96.0.0/12;
    (4) 最后一个选项“--ignore-preflight-errors=Swap”仅应该在未禁用Swap设备的状态下使用。       
 1.参数说明:
--kubernetes-version  # 指定要安装的k8s版本
--pod-network-cidr    # 指定pod网络地址范围
--service-cidr   # 指定service网络地址范围
--apiserver-advertise-address #指定api地址,这里配置成了master的私网接口IP
 
2)根据kubeadm init执行时的报错提示,可以获知需要下载哪些镜像,这些镜像可以先从阿里云的registry下载,下载完成后再重新打tag,具体操作如下:
 
[root@master scripts]# cat get_k8s_img_from_aliyun.sh
#!/bin/bash
 
# need get images
images=(
k8s.gcr.io/kube-apiserver:v1.13.3
k8s.gcr.io/kube-controller-manager:v1.13.3
k8s.gcr.io/kube-scheduler:v1.13.3
k8s.gcr.io/kube-proxy:v1.13.3
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.2.24
k8s.gcr.io/coredns:1.2.6
)
 
k8s_registry=k8s.gcr.io
aliyun_registry=registry.cn-hangzhou.aliyuncs.com
 
# get images from aliyun registry
function get_aliyun_k8s_images() {
for k8s_image in ${images[*]};do
image=` echo $k8s_image | awk -F '/' '{print $2}'`
docker pull $aliyun_registry/google_containers/$image
done
}
 
# tag images to k8s.gcr.io registry
function tag_images() {
for k8s_image in ${images[*]};do
image=` echo $k8s_image | awk -F '/' '{print $2}'`
docker tag $aliyun_registry/google_containers/$image $k8s_registry/$image
done
}
 
get_aliyun_k8s_images
tag_images
 
docker pull quay.io/coreos/flannel:v0.11.0-amd64
docker images
 
kubeadm init 初始化成功后,可以看到如下信息:
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:
 
Then you can join any number of worker nodes by running the following on each as root:
 
kubeadm join 172.16.99.121:6443 --token bx6k9x.p2im6h7e9jc1kpgh \
    --discovery-token-ca-cert-hash sha256:4607ede1c693489c1338f77565ac613b7451918faadb018448f16a79609a425e
 
初始化方式二:
 
kubeadm也可通过配置文件加载配置,以定制更丰富的部署选项。以下是个符合前述命令设定方式的使用示例,不过,它明确定义了kubeProxy的模式为ipvs,并支持通过修改imageRepository的值修改获取系统镜像时使用的镜像仓库。
 
apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: v1.13.3
api:
  advertiseAddress: 172.16.99.121
  bindPort: 6443
  controlPlaneEndpoint: ""
imageRepository: k8s.gcr.io
kubeProxy:
  config:
    mode: "ipvs"
    ipvs:
      ExcludeCIDRs: null
      minSyncPeriod: 0s
      scheduler: ""
      syncPeriod: 30s    
kubeletConfiguration:
  baseConfig:
    cgroupDriver: cgroupfs
    clusterDNS:
    - 10.96.0.10
    clusterDomain: cluster.local
    failSwapOn: false
    resolvConf: /etc/resolv.conf
    staticPodPath: /etc/kubernetes/manifests
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.96.0.0/12
  
将上面的内容保存于配置文件中,例如kubeadm-config.yaml,而后执行相应的命令:
    
   # kubeadm init --config kubeadm-config.yaml --ignore-preflight-errors=Swap
 
            
注意:对于Kubernetes系统的新用户来说,无论使用上述哪种方法,命令运行结束后,请记录最后的kubeadm join命令输出的最后提示的操作步骤。下面的内容是需要用户记录的一个命令输出示例,它提示了后续需要的操作步骤:
 
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 172.16.99.121:6443 --token bx6k9x.p2im6h7e9jc1kpgh \
    --discovery-token-ca-cert-hash sha256:4607ede1c693489c1338f77565ac613b7451918faadb018448f16a79609a425e
另外,kubeadm init命令完整参考指南请移步官方文档。https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/
           
 
 
2、初始化kubectl
 
kubectl是kube-apiserver的命令行客户端程序,实现了除系统部署之外的几乎全部的管理操作,是kubernetes管理员使用最多的命令之一。kubectl需经由API server认证及授权后方能执行相应的管理操作,kubeadm部署的集群为其生成了一个具有管理员权限的认证配置文件/etc/kubernetes/admin.conf,它可由kubectl通过默认的“$HOME/.kube/config”的路径进行加载。当然,用户也可在kubectl命令上使用--kubeconfig选项指定一个别的位置。
 
下面复制认证为Kubernetes系统管理员的配置文件至目标用户(例如当前用户root)的家目录下:
 
    # mkdir ~/.kube
    # cp /etc/kubernetes/admin.conf ~/.kube/config
                
而后,即可通过kubectl进行客户端命令测试,并借此了解集群组件的当前状态:
    # kubectl get componentstatus
    
一个正常的输出应该类似如下输出结果所示:
[root@k8s-vm1 ~]# kubectl get componentstatus
NAME                 STATUS    MESSAGE              ERROR
controller-manager   Healthy   ok                   
scheduler            Healthy   ok                   
etcd-0               Healthy   {"health": "true"}
   
3、添加flannel网络附件
 
Kubernetes系统上Pod网络的实现依赖于第三方插件进行,这类插件有近数十种之多,较为著名的有flannel、calico、canal和kube-router等,简单易用的实现是为CoreOS提供的flannel项目。下面的命令用于在线部署flannel至Kubernetes系统之上:
 
这个步骤也可以拆分成两步
# kubectl apply -f kube-flannel.yml
    
而后使用如下命令确认其输出结果中Pod的状态为“Running”,类似如下所示:
# kubectl get pods -n kube-system
NAME                              READY   STATUS    RESTARTS   AGE
coredns-86c58d9df4-6b9kw          1/1     Running   0          12m
coredns-86c58d9df4-jvwmb          1/1     Running   0          12m
etcd-k8s-vm1                      1/1     Running   1          12m
kube-apiserver-k8s-vm1            1/1     Running   1          12m
kube-controller-manager-k8s-vm1   1/1     Running   2          12m
kube-flannel-ds-amd64-s67wg       1/1     Running   0          48s
kube-proxy-lbrbn                  1/1     Running   0          12m
kube-scheduler-k8s-vm1            1/1     Running   2          12m
# kubectl get pods -n kube-system -l app=flannel
NAME                          READY   STATUS    RESTARTS   AGE
kube-flannel-ds-amd64-s67wg   1/1     Running   0          83s
 
4、验正master节点已经就绪
 
# kubectl get nodes
    
上述命令应该会得到类似如下输出:    
 
NAME      STATUS   ROLES    AGE   VERSION
k8s-vm2   Ready    master   14m   v1.13.3
 
 
五、添加节点到集群中(在k8s-vm2和k8s-vm3上分别完成如下操作)
 
1、若未禁用Swap设备,编辑kubelet的配置文件/etc/sysconfig/kubelet,设置其忽略Swap启用的状态错误,内容如下:
    KUBELET_EXTRA_ARGS="--fail-swap-on=false"
 
2、将节点加入第二步中创建的master的集群中,要使用主节点初始化过程中记录的kubeadm join命令,并且在未禁用Swap设备的情况下,额外附加“--ignore-preflight-errors=Swap”选项;
 
    # kubeadm join 172.16.99.121:6443 --token gwxgdg.igg5728t1vt8ahhx --discovery-token-ca-cert-hash sha256:9b63cd1530b50da4733d2e7dace9270782211e25ec2e4bbac395e59adc56a26c --ignore-preflight-errors=Swap
   
在每个节点添加完成后,即可通过kubectl验正添加结果。下面的命令及其输出是在k8s-vm2和k8s-vm3均添加完成后运行的,其输出结果表明两个Node已经准备就绪。
 
    # kubectl get nodes
    NAME                  STATUS   ROLES    AGE     VERSION
    k8s-vm1.magedu.com   Ready    master   31m     v1.13.3
    k8s-vm2.magedu.com     Ready    <none>   3m8s    v1.13.3
    k8s-vm3.magedu.com     Ready    <none>   2m25s   v1.13.3
 
到此为止,一个master,并附带有两个node的kubernetes集群基础设施已经部署完成,用户随后即可测试其核心功能。例如,下面的命令可将myapp以Pod的形式编排运行于集群之上,并通过在集群外部进行访问:
 
    # kubectl create deployment myapp --image=ikubernetes/myapp:v1
    # kubectl create service nodeport myapp --tcp=80:80
 
而后,使用如下命令了解Service对象myapp使用的NodePort,以便于在集群外部进行访问:
    # kubectl get svc -l app=myapp
NAME    TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
myapp   NodePort   10.107.226.218   <none>        80:32295/TCP   19s
 
    
myapp是一个web应用,因此,用户可以于集群外部通过“http://NodeIP:32295”这个URL访问myapp上的应用,例如于集群外通过浏览器访问“http://172.16.99.122:32295/”。
 
 
 
报错1:kubeadm config images pull和kubeadm init失败的问题
kubeadm config images pull和kubeadm init时,会因为无法访问google,导致镜像下载失败,解决办法有如下2种:
1)想办法使用代理上google,有朋友要找到好用的代理告诉我下,^_^。
  配置docker使用代理,配置完成后,重启docker服务
 
# vi /usr/lib/systemd/system/docker.service
[Service]
……
Environment="HTTPS_PROXY=http://www.ik8s.io:10080"
Environment="NO_PROXY=127.0.0.0/8,192.168.0.0/16"
……
 
2)根据kubeadm init执行时的报错提示,可以获知需要下载哪些镜像,这些镜像可以先从阿里云的registry下载,下载完成后再重新打tag,具体操作如下:
 
[root@master scripts]# cat get_k8s_img_from_aliyun.sh
#!/bin/bash
# need get images
images=(
k8s.gcr.io/kube-apiserver:v1.13.3
k8s.gcr.io/kube-controller-manager:v1.13.3
k8s.gcr.io/kube-scheduler:v1.13.3
k8s.gcr.io/kube-proxy:v1.13.3
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.2.24
k8s.gcr.io/coredns:1.2.6
)
k8s_registry=k8s.gcr.io
aliyun_registry=registry.cn-hangzhou.aliyuncs.com
# get images from aliyun registry
function get_aliyun_k8s_images() {
for k8s_image in ${images[*]};do
image=` echo $k8s_image | awk -F '/' '{print $2}'`
docker pull $aliyun_registry/google_containers/$image
done
}
# tag images to k8s.gcr.io registry
function tag_images() {
for k8s_image in ${images[*]};do
image=` echo $k8s_image | awk -F '/' '{print $2}'`
docker tag $aliyun_registry/google_containers/$image $k8s_registry/$image
done
}
get_aliyun_k8s_images
tag_images
docker pull quay.io/coreos/flannel:v0.11.0-amd64
docker images
 
 
当然这些镜像也可以手动进行下载,操作如下:
kubeadm config images list命令查看需要的镜像,
如下
k8s.gcr.io/kube-apiserver:v1.13.3
k8s.gcr.io/kube-controller-manager:v1.13.3
k8s.gcr.io/kube-scheduler:v1.13.3
k8s.gcr.io/kube-proxy:v1.13.3
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.2.24
k8s.gcr.io/coredns:1.2.6
kubeadm初始化默认使用的镜像仓库是k8s.gcr.io,为了解决问题,我们可以使用国内云计算厂商都提供了kubernetes的镜像服务,
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.13.3
(其余镜像都采用这种方法,将后边的镜像名替换)
将下载后的镜像打上tag,来符合kudeadm init初始化时候的要求
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.13.3  k8s.gcr.io/kube-apiserver:v1.13.3
kubeadm config images list中需要的镜像全部下载完成
 
 
 
 
kubeadm init 初始化成功后,可以看到如下信息:
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:
 
Then you can join any number of worker nodes by running the following on each as root:
 
kubeadm join 172.16.99.121:6443 --token bx6k9x.p2im6h7e9jc1kpgh \
    --discovery-token-ca-cert-hash sha256:4607ede1c693489c1338f77565ac613b7451918faadb018448f16a79609a425e
 
 
 
注:如果你对kubeadm init 或者kubeadm join的结果不满意,准备再次 kubeadm init 或者kubeadm join,那么在 kubeadm init 或者kubeadm join始化前,需要在那个节点执行下面的命令
# kubeadm reset
# mv .kube/config{,.bak}

kubeadm部署k8s的更多相关文章

  1. ubuntu18.04使用kubeadm部署k8s单节点

    实验目的: 体验kubeadm部署k8s服务,全流程体验! 实验环境: ubuntu18.04 联网在线部署 kubeadm 01.系统检查 节点主机名唯一,建议写入/etc/hosts 禁止swap ...

  2. 使用kubeadm部署K8S v1.17.0集群

    kubeadm部署K8S集群 安装前的准备 集群机器 172.22.34.34 K8S00 172.22.34.35 K8S01 172.22.34.36 K8S02 注意: 本文档中的 etcd . ...

  3. 使用kubeadm部署k8s集群[v1.18.0]

    使用kubeadm部署k8s集群 环境 IP地址 主机名 节点 10.0.0.63 k8s-master1 master1 10.0.0.63 k8s-master2 master2 10.0.0.6 ...

  4. Kubeadm部署k8s单点master

    Kubeadm部署k8s单点master 1.环境准备: 主机名 IP 说明 宿主机系统 master 10.0.0.17 Kubernetes集群的master节点 CentOS 7.9 node1 ...

  5. 【02】Kubernets:使用 kubeadm 部署 K8S 集群

    写在前面的话 通过上一节,知道了 K8S 有 Master / Node 组成,但是具体怎么个组成法,就是这一节具体谈的内容.概念性的东西我们会尽量以实验的形式将其复现. 部署 K8S 集群 互联网常 ...

  6. (二)Kubernetes kubeadm部署k8s集群

    kubeadm介绍 kubeadm是Kubernetes项目自带的及集群构建工具,负责执行构建一个最小化的可用集群以及将其启动等的必要基本步骤,kubeadm是Kubernetes集群全生命周期的管理 ...

  7. 使用kubeadm部署k8s

    k8s组件 master,node master中包括apiserver,scheduler,controller.etcd apiserver:负责接收用户请求,并且保存至etcd中. schedu ...

  8. 在Centos7.6使用kubeadm部署k8s 1.14.3

    K8s不是一个软件,而是一堆软件的集合,由于这堆软件各自独立,因此可能k8s安装过程很容易出现问题 K8s部署有多种方式,本文使用kubeadm部署,从易操作性和可控性来说属于中等的方式 环境:cen ...

  9. kubeadm部署k8s集群

    kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Master 节点 kubeadm ini ...

  10. 解决阿里云ECS下kubeadm部署k8s无法指定公网IP

    背景 一般情况下,"kubeadm"部署集群时指定"--apiserver-advertise-address=<public_ip>"参数,即可在 ...

随机推荐

  1. transient关键字的作用以及几个疑问的解决

    目录 1.从Serilizable说到transient 2.序列化属性对象的类需要实现Serilizable接口? 3.不想被序列化的字段怎么办? 4.ArrayList里面的elementData ...

  2. mq消息消费,broker选址

    PullRequest.MessageQueue.BrokerName 根据PullRequest.MessageQueue得到brokerId,默认0或者用缓存中的suggest,每次消息拉取后会更 ...

  3. 浅谈代理模式与java中的动态代理

    代理模式的定义: 代理模式是一个使用律非常高的模式,定义如下: 为其他对象提供一种代理,以控制对这个对象的访问. 类图: 简单的静态代理: public interface IRunner{ //这是 ...

  4. 怎么用fio测试存储性能

    1 /// -rw=read(100%顺序读) -rw=write(100%顺序写) -rw=randread(100%随机读) -rw=randwrite(100%随机写), 2 ///-rw=rw ...

  5. 用PyCharm打个专业的招呼

    PyCharm 是什么 PyCharm(读作"拍恰姆")是 JetBrains 全家桶中的一员,专门用来写 Python 的: 官方网址是: https://www.jetbrai ...

  6. LeetCode 025 Reverse Nodes in k-Group

    题目描述:Reverse Nodes in k-Group Given a linked list, reverse the nodes of a linked list k at a time an ...

  7. PADS生成贴片文件

    PADS生成贴片文件 VIEW-BOTTOM VIEW能够使Bottom层正常显示. 1. pastmask_top->Output Devices->Device Setup- 2. 进 ...

  8. 关于 [栈溢出后jmp esp执行shellcode] 原理分析

    原文地址:https://blog.csdn.net/lixiangminghate/article/details/53333710 正常情况下,函数栈分布图如下: 即,返回地址被改为一段缓存区的地 ...

  9. 20200416_Centos 7.2 在安装系统之前把数据备份出来

    第一种方法: 起因: 服务器强制断电, 然后就再也启动不起来了, 进入救援模式, 一直卡死在 charoot /mnt/sysimages; 然后想在救援模式下的shell中挂载我的2T的移动硬盘, ...

  10. 洛谷P3901 数列找不同(莫队水题)

    重温下手感,判断区间是否全是不同的数字有两种做法,一个长度为len的区间不同的数字,参见HH的项链,一种是区间众数,参见蒲公英,是水题没错了.明天搞数据库,然后继续自己的gre和训练计划 #inclu ...