k8s部署及管理

kubernetes

概述

官网地址:https://kubernetes.io/zh/docs/concepts/overview
—kubernetes名字来自希腊语,意思是舵手(领航员),k8s是将k和s之间的8个字母ubernete替换成8的缩写
—Kubernetes的创造者是行业巨头Google
—Kubernetes是基于Borg的大规模容器管理的开源版本
—2014年6月Google正式公布并宣布开源
—编配,管理,调度等各方面集成的一套管理容器的系统
—Kubernetes 是一个开源容器管理工具,负责容器部署,容器扩缩容以及负载平衡等功能
—Kubernetes 不是一个容器化平台,而是一个多容器管理解决方案
k8s部署及管理

kubernetes适用场景

—有大量跨主机的容器需要管理
—快速部署应用
—快速扩张应用
—无缝对接的应用功能
—节省资源,优化硬件资源的使用

kubernetes架构

核心角色: master(管理节点), node(计算节点),image(镜像仓库)
k8s部署及管理

master节点

—Master提供集群的控制
—对集群进行决策
—检测和影响集群事件
—Master主要由 apiserver kubeproxy schedule controllermanager etcd组成
1 API Server 提供 REST 操作和到集群共享状态的前端,所有其他组件通过它进行交互,端口6443。
2 Schedule 监视那些新创建的未指定运行节点的 Pod,并选择节点让 Pod 在上面运行,端口10251。
3 controller-manager 主节点上运行控制器的组件,负责管理控制器,端口10252.
节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应。
副本控制器(Replication Controller): 负责为系统中的每个副本控制器对象维护正确数量的 Pod。
端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)。
服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌.
4 etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库,用户无需手动干预,集群自动管理,端口2379-2380。

node节点

—kubernetes的计算节点
—维护运行pod,并提供具体应用的环境
—计算节点设计成水平扩展,该组件在多个节点上运行
—node由kubelet,kube-proxy,和docker组成
1 pod:最小部署单元,一组容器的集合,共享网络,生命周期是短暂的
2 kubelet 一个在集群中每个节点上运行的代理。它保证容器都运行在 Pod 中
3 kuber-proxy 是集群中每个节点上运行的网络代理,实现 Kubernetes Service 概念的一部分,维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。
4 Container Runtime 容器运行环境是负责运行容器的软件 支持多个容器运行环境: docker、 containerd、CRI-O 以及任何实现 Kubernetes CRI (容器运行环境接口)。
插件(Addons) 。
5 docker:是一个开源的应用容器引擎,基于Go语言实现,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

Addons插件

插件使用 Kubernetes 资源(DaemonSet、 Deployment等)实现集群功能。 因为这些插件提供集群级别的功能,插件中命名空间域的资源属于 kube-system 命名空间。
1 DNS:集群 DNS 是一个 DNS 服务器,和环境中的其他 DNS 服务器一起工作,它为 Kubernetes 服务提供 DNS 记录。
2 Web 界面:Dashboard 是K ubernetes 集群的通用的、基于 Web 的用户界面。 它使用户可以管理集群中运行的应用程序以及集群本身并进行故障排除。
3 容器资源监控 :容器资源监控 将关于容器的一些常见的时间序列度量值保存到一个集中的数据库中,并提供用于浏览这些数据的界面。
4 集群层面日志 :机制负责将容器的日志数据 保存到一个集中的日志存储中,该存储能够提供搜索和浏览接口。
5 网络插件:flannel是一个可以用于 Kubernetes 的 overlay 网络提供者,实质上是一种“覆盖网络”也就是将TCP数据包装在另一种网络里面进行路由转发和通信,目前支持UDP,VxLAN,AWS VPC和GCE路由数据转发方式。不同主机的内容实现互通互联。https://github.com/coreos/flannel/blob/master/Documentation/kube-flannel.yml
k8s部署及管理

总结k8s概念

  1. cluster
    cluster是 计算、存储和网络资源的集合,k8s利用这些资源运行各种基于容器的应用。
    2.master
    master是cluster的大脑,他的主要职责是调度,即决定将应用放在那里运行。master运行linux操作系统,可以是物理机或者虚拟机。为了实现高可用,可以运行多个master。
    3.node
    node的职责是运行容器应用。node由master管理,node负责监控并汇报容器的状态,同时根据master的要求管理容器的生命周期。node运行在linux的操作系统上,可以是物理机或者是虚拟机。
    4.pod
    pod是k8s的最小工作单元。每个pod包含一个或者多个容器。pod中的容器会作为一个整体被master调度到一个node上运行。
    5.controller
    k8s通常不会直接创建pod,而是通过controller来管理pod的。controller中定义了pod的部署特性,比如有几个剧本,在什么样的node上运行等。为了满足不同的业务场景,k8s提供了多种controller,包括deployment、replicaset、daemonset、statefulset、job等。
    6.deployment
    是最常用的controller。deployment可以管理pod的多个副本,并确保pod按照期望的状态运行。
    7.replicaset
    实现了pod的多副本管理。使用deployment时会自动创建replicaset,也就是说deployment是通过replicaset来管理pod的多个副本的,我们通常不需要直接使用replicaset。
    8.daemonset
    用于每个node最多只运行一个pod副本的场景。正如其名称所示的,daemonset通常用于运行daemon。
    9.statefuleset
    能够保证pod的每个副本在整个生命周期中名称是不变的,而其他controller不提供这个功能。当某个pod发生故障需要删除并重新启动时,pod的名称会发生变化,同时statefulset会保证副本按照固定的顺序启动、更新或者删除。、
    10.job
    用于运行结束就删除的应用,而其他controller中的pod通常是长期持续运行的。
    11.service
    deployment可以部署多个副本,每个pod 都有自己的IP,外界如何访问这些副本那?
    答案是service
    k8s的 service定义了外界访问一组特定pod的方式。service有自己的IP和端口,service为pod提供了负载均衡。
    k8s运行容器pod与访问容器这两项任务分别由controller和service执行。
    12.namespace
    可以将一个物理的cluster逻辑上划分成多个虚拟cluster,每个cluster就是一个namespace。不同的namespace里的资源是完全隔离的。
    13.kubeadm 用来初始化集群的指令。
    14.kubelet 在集群中的每个节点上用来启动 pod 和容器等
    15.kubectl 用来与集群通信的命令行工具。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。

kubernetes安装

官方文档安装https://kubernetes.io/docs/setup/independent/install-kubeadm/
安装 kubeadm、kubelet 和 kubectl
官网安装: sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

华为云主机
master 192.168.1.21 2CPU,2G内存
node-0001 192.168.1.31 2CPU,2G内存
node-0002 192.168.1.32 2CPU,2G内存
node-0003 192.168.1.33 2CPU,2G内存
registry 192.168.1.100 1CPU,1G内存
k8s部署及管理k8s部署及管理

kube-master安装 :方法一

1 优化系统服务
禁用 selinux,禁用 swap,卸载 firewalld-*
[[email protected] ~]# systemctl stop postfix
[[email protected] ~]# yum remove -y postfix firewalld-*
[[email protected] ~]# yum install chrony
[[[email protected] ~]# vim /etc/chrony.conf
#注释掉 server 开头行,添加下面的配置
server ntp.myhuaweicloud.com minpoll 4 maxpoll 10 iburst
[[email protected] ~]# systemctl enable --now chronyd
[[email protected] ~]# chronyc sources -v
#验证配置结果 ^* 代表成功
[[email protected] ~]# vim /etc/cloud/cloud.cfg
#manage_etc_hosts: localhost 注释掉这一行
[[email protected] ~]# sed -i ‘/SELINUX/s/enforcing/permissive/’ /etc/selinux/config
[[email protected] ~]# swapoff -a 临时
[[email protected] ~]# sed -ri ‘s/ .* /#&/’ /etc/fstab

仓库初始化
1.1删除原有云主机,重新购买
主机名称 IP地址 最低配置
registry 192.168.1.100 1CPU,1G内存
1.2、安装仓库服务

[[email protected] ~]# yum makecache
[[email protected] ~]# yum install -y docker-distribution
[[email protected] ~]# systemctl enable --now docker-distribution

1.3、使用脚本初始化仓库

拷贝云盘 kubernetes/v1.17.6/registry/myos目录 到 仓库服务器

[[email protected] ~]# cd myos
[[email protected] ~]# chmod 755 init-img.sh
[[email protected] ~]# ./init-img.sh
[[email protected] ~]# curl http://192.168.1.100:5000/v2/myos/tags/list
{“name”:“myos”,“tags”:[“nginx”,“php-fpm”,“v1804”,“httpd”]}

2、配置yum仓库
[[email protected] ~] 跳板机,配置提供yum源
[[email protected] ~]# cp -a v1.17.6/k8s-install /var/ftp/localrepo/
[[email protected] ~]# cd /var/ftp/localrepo/
[[email protected] localrepo]# createrepo --update .

3、安装工具软件包
安装kubeadm、kubectl、kubelet、docker-ce
[[email protected] ~]# yum makecache
[[email protected] ~]# yum install -y kubeadm kubelet kubectl docker-ce
[[email protected] ~]# mkdir -p /etc/docker
[[email protected] ~]# vim /etc/docker/daemon.json
{
“exec-opts”: [“native.cgroupdriver=systemd”],
“registry-mirrors”: [“https://hub-mirror.c.163.com”],
“insecure-registries”:[“192.168.1.100:5000”, “registry:5000”]
}
[[email protected] ~]# systemctl enable --now docker kubelet
[[email protected] ~]# docker info |grep Cgroup
Cgroup Driver: systemd
[[email protected] ~]# vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
[[email protected] ~]# modprobe br_netfilter
[[email protected] ~]# sysctl --system
4、镜像导入私有仓库
把云盘 kubernetes/v1.17.6/base-images 中的镜像拷贝到 master
[[email protected] ~]# cd base-images/
[[email protected] base-image]# for i in .tar.gz;do docker load -i ${i};done
[[email protected] base-image]# docker images
[[email protected] base-image]# docker images |awk ‘$2!=“TAG”{print $1,$2}’|while read _f _v;do
docker tag ${_f}: ${_v} 192.168.1.100:5000/ ${_f##
/}: ${_v};
docker push 192.168.1.100:5000/ ${_f##*/}: ${_v};
docker rmi ${_f}: ${_v};
done
#查看验证
[[email protected] base-image]# curl http://192.168.1.100:5000/v2/_catalog

5、Tab键设置
[[email protected] ~]# kubectl completion bash >/etc/bash_completion.d/kubectl
[[email protected] ~]# kubeadm completion bash >/etc/bash_completion.d/kubeadm
[[email protected] ~]# exit

6、安装IPVS代理软件包
[[email protected] ~]# yum install -y ipvsadm ipset

7、系统初始化,排错
[[email protected] ~]# vim /etc/hosts
192.168.1.21 master
192.168.1.31 node-0001
192.168.1.32 node-0002
192.168.1.33 node-0003
192.168.1.100 registry
[[email protected] ~]# kubeadm init --dry-run
8、使用kubeadm部署
应答文件在云盘的 kubernetes/v1.17.6/config 目录下
[[email protected] ~]# mkdir init;cd init
#拷贝 kubeadm-init.yaml 到 master 云主机 init 目录下
[[email protected] init]# kubeadm init --config=kubeadm-init.yaml |tee master-init.log
创建日志 tee master-init.log
#根据提示执行命令
[[email protected] init]# mkdir -p $HOME/.kube
[[email protected] init]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[[email protected] init]# sudo chown $(id -u): $(id -g) $HOME/.kube/config
9、验证安装结果
[[email protected] ~]# kubectl version
[[email protected] ~]# kubectl get componentstatuses
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {“health”:“true”}

node计算节点安装

1、获取token
删除原有token
[[email protected] ~]# kubeadm token list
[[email protected] ~]# kubeadm token delete XXXX(上面list查找到的)
创建token
[[email protected] ~]# kubeadm token create --ttl=0 --print-join-command
[[email protected] ~]# kubeadm token list
#获取token_hash
[[email protected] ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt |openssl rsa -pubin -outform der |openssl dgst -sha256 -hex
2、node安装
拷贝云盘上 kubernetes/v1.17.6/node-install 到跳板机

[[email protected] ~]# cd node-install/
[[email protected] node-install]# vim files/hosts
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.1.21 master
192.168.1.31 node-0001
192.168.1.32 node-0002
192.168.1.33 node-0003
192.168.1.100 registry
[[email protected] node-install]# vim node_install.yaml
.—

  • name:
    hosts:
    • nodes
      vars:
      master: ‘192.168.1.21:6443’
      token: ‘ye99yg.gv866warn6067oox’
      token_hash: ‘sha256:9fa1341dfce3815cffd64d77968f35cac773ada4f7a71fb73eb28f62ee990002’
      tasks:
    • name: disable swap
      lineinfile:
      path: /etc/fstab
      regexp: ‘swap’
      state: absent
      notify: disable swap
    • name: Ensure SELinux is set to disabled mode
      lineinfile:
      path: /etc/selinux/config
      regexp: ‘^SELINUX=’
      line: SELINUX=disabled
      notify: disable selinux
    • name: remove the firewalld
      yum:
      name:
      • firewalld
      • firewalld-filesystem
        state: absent
    • name: install k8s node tools
      yum:
      name:
      • kubeadm
      • kubelet
      • docker-ce
      • ipvsadm
      • ipset
        state: present
        update_cache: yes
    • name: Create a directory if it does not exist
      file:
      path: /etc/docker
      state: directory
      mode: ‘0755’
    • name: Copy file with /etc/hosts
      copy:
      src: files/hosts
      dest: /etc/hosts
      owner: root
      group: root
      mode: ‘0644’
    • name: Copy file with /etc/docker/daemon.json
      copy:
      src: files/daemon.json
      dest: /etc/docker/daemon.json
      owner: root
      group: root
      mode: ‘0644’
    • name: Copy file with /etc/sysctl.d/k8s.conf
      copy:
      src: files/k8s.conf
      dest: /etc/sysctl.d/k8s.conf
      owner: root
      group: root
      mode: ‘0644’
      notify: enable sysctl args
    • name: enable k8s node service
      service:
      name: “{{ item }}”
      state: started
      enabled: yes
      with_items:
      • docker
      • kubelet
    • name: check node state
      stat:
      path: /etc/kubernetes/kubelet.conf
      register: result
    • name: node join
      shell: kubeadm join ‘{{ master }}’ --token ‘{{ token }}’ --discovery-token-ca-cert-hash ‘{{ token_hash }}’
      when: result.stat.exists == False
      handlers:
    • name: disable swap
      shell: swapoff -a
    • name: disable selinux
      shell: setenforce 0
    • name: enable sysctl args
      shell: sysctl --system

[[email protected] node-install]# ansible-playbook node_install.yaml
3、验证安装
[[email protected] ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 130m v1.17.6
node-0001 NotReady 2m14s v1.17.6
node-0002 NotReady 2m15s v1.17.6
node-0003 NotReady 2m9s v1.17.6

网络插件安装配置

拷贝云盘 kubernetes/v1.17.6/flannel 目录到 master 上
1、上传镜像到私有仓库

[[email protected] ~]# cd flannel
[[email protected] flannel]# docker load -i flannel.tar.gz
[[email protected] flannel]# docker tag quay.io/coreos/flannel:v0.12.0-amd64 192.168.1.100:5000/flannel:v0.12.0-amd64
[[email protected] flannel]# docker push 192.168.1.100:5000/flannel:v0.12.0-amd64

2、修改配置文件并安装

[[email protected] flannel]# vim kube-flannel.yml
128: “Network”: “10.244.0.0/16”,
172: image: 192.168.1.100:5000/flannel:v0.12.0-amd64
186: image: 192.168.1.100:5000/flannel:v0.12.0-amd64
227-结尾: 删除
[[email protected] flannel]# kubectl apply -f kube-flannel.yml

3、验证结果

[[email protected] flannel]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 26h v1.17.6
node-0001 Ready 151m v1.17.6
node-0002 Ready 152m v1.17.6
node-0003 Ready 153m v1.17.6

kube-master安装 :方法二

1 安装kubelet、kubeadm 和 kubectl docker-ce

[[email protected] ~]# wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[[email protected] ~]# yum -y install docker-ce
[[email protected] ~]# mkdir /etc/docker
[[email protected] ~]# cat /etc/docker/daemon.json
{
“exec-opts”: [“native.cgroupdriver=systemd”],
“registry-mirrors”: [“https://XXX.mirror.aliyuncs.com”]
}
[[email protected] ~]# systemctl restart docker
[[email protected] ~]# systemctl enable docker
[[email protected] ~]# vim /etc/yum.repos.d/k8s.repo
[k8s]
name=k8s
enabled=1
gpgcheck=0
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
[[email protected] ~]# yum -y install kubelet kubeadm kubectl
暂时还不能启动服务

2 用 kubeadm 创建 Cluster
各个节点都需要执行下面的操作master,node
[[email protected] ~]# vim /etc/hosts
192.168.1.21 master
192.168.1.31 node-0001
192.168.1.32 node-0002
192.168.1.33 node-0003
192.168.1.100 registry

要保证打开内置的桥功能,这个是借助于iptables来实现的
[[email protected] ~]# echo “1” >/proc/sys/net/bridge/bridge-nf-call-iptables
禁止各个节点启用swap,如果启用了swap,那么kubelet就无法启动
[[email protected] ~]# swapoff -a && sysctl -w vm.swappiness=0
vm.swappiness = 0
[[email protected] ~]# free -m
total used free shared buff/cache available
Mem: 991 151 365 7 475 674
Swap: 0 0 0
关闭防火墙和selinux
[[email protected] ~]# yum remove -y postfix firewalld-*
[[email protected] ~]# sed -i ‘/SELINUX/s/enforcing/permissive/’ /etc/selinux/config

3 初始化master
[[email protected] ~]# kubeadm init --image-repository registry.aliyuncs.com/google_containers
–kubernetes-version v1.17.1
–apiserver-advertise-address 192.168.1.21
–pod-network-cidr=10.244.0.0/16 |tee master-init.log

–image-repository string:这个用于指定从什么位置来拉取镜像(1.13版本才有的),默认值是k8s.gcr.io,我们将其指定为国内镜像地址:registry.aliyuncs.com/google_containers
–kubernetes-version string:指定kubenets版本号,默认值是stable-1,会导致从https://dl.k8s.io/release/stable-1.txt下载最新的版本号,我们可以将其指定为固定版本(最新版:v1.19.2)来跳过网络请求。
–apiserver-advertise-address 指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。
–pod-network-cidr指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 --pod-network-cidr有自己的要求,这里设置为10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。
service-cidr是svc网络,–service-cidr=2.2.2.1/16
创建 日志 tee master-init.log
(推荐)如果计划将单个控制平面 kubeadm 集群升级成高可用, 你应该指定 --control-plane-endpoint 为所有控制平面节点设置共享端点。 端点可以是负载均衡器的 DNS 名称或 IP 地址。

看到下面的输出就表示你的集群创建成功了

Your Kubernetes master has initialized successfully!

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

kubeadm join 172.20.10.2:6443 --token rn816q.zj0cdlksganmdfkr --discovery-token-ca-cert-hash sha256:e339e4dbf6bd3683c13e794760fff3cbeb7a3f6f42b71d4cb3cffdde72176658
如果初始化失败,请使用如下代码清除后重新初始化
#kubeadm reset
#ifconfig cni0 down
#ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
#rm -rf /var/lib/cni/
#rm -rf /var/lib/etcd/*

docker初始化成功下载的镜像
[[email protected] ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.aliyuncs.com/google_containers/kube-proxy v1.17.1 fdb321fd30a0 6 weeks ago 80.2MB
registry.aliyuncs.com/google_containers/kube-controller-manager v1.17.1 26e6f1db2a52 6 weeks ago 146MB
registry.aliyuncs.com/google_containers/kube-apiserver v1.17.1 40a63db91ef8 6 weeks ago 181MB
registry.aliyuncs.com/google_containers/kube-scheduler v1.17.1 ab81d7360408 6 weeks ago 79.6MB
registry.aliyuncs.com/google_containers/coredns 1.2.6 f59dcacceff4 2 months ago 40MB
busybox latest 59788edf1f3e 3 months ago 1.15MB
registry.aliyuncs.com/google_containers/etcd 3.2.24 3cab8e1b9802 4 months ago 220MB
registry.aliyuncs.com/google_containers/pause 3.1 da86e6ba6ca1 13 months ago 742kB

配置kubectl
[[email protected] ~]# mkdir -p $HOME/.kube
[[email protected] ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[[email protected] ~]# chown $(id -u): $(id -g) $HOME/.kube/config
为了使用更便捷,启用 kubectl 命令的自动补全功能。
[[email protected] ~]# echo “source <(kubectl completion bash)” >> ~/.bashrc
[[email protected] ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {“health”: “true”}
安装pod网络
要让 Kubernetes Cluster 能够工作,必须安装 Pod 网络,否则 Pod 之间无法通信。
[[email protected] ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
每个节点启动kubelet
[[email protected] ~]# systemctl restart kubelet
等镜像下载完成以后,看到node的状态是ready了
[[email protected] ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
ken Ready master 17m v1.13.2
此时,就可以看到pod信息了
[[email protected] ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-78d4cf999f-dbxpc 1/1 Running 0 19m
coredns-78d4cf999f-q9vq2 1/1 Running 0 19m
etcd-ken 1/1 Running 0 18m
kube-apiserver-ken 1/1 Running 0 18m
kube-controller-manager-ken 1/1 Running 0 18m
kube-flannel-ds-amd64-fd8mv 1/1 Running 0 3m26s
kube-proxy-gwmr2 1/1 Running 0 19m
kube-scheduler-ken 1/1 Running 0 18m

添加 k8s-node1 和 k8s-node2 k8s-node3
第一步:环境准备
1.node节点关闭防火墙和selinux
2.禁用swap
3. 解析主机名
4.启动内核功能
第二步:添加nodes
这里的–token 来自前面kubeadm init输出提示,如果当时没有记录下来可以通过kubeadm token list 查看。
[[email protected] ~]# kubeadm join 172.20.10.2:6443 --token rn816q.zj0cdlksganmdfkr --discovery-token-ca-cert-hash sha256:e339e4dbf6bd3683c13e794760fff3cbeb7a3f6f42b71d4cb3cffdde72176658
第三步:查看nodes
根据上面最后一行的输出信息提示查看nodes
[[email protected] ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node-0001 NotReady 2m54s v1.17.2
node-0002 NotReady 2m16s v1.17.2
node-0003 NotReady 2m16s v1.17.2
master Ready master 38m v1.17.2
过了一会查看节点状态
[[email protected] ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node-0001 Ready 2m54s v1.17.2
node-0002 Ready 2m16s v1.17.2
node-0003 Ready 2m16s v1.17.2
master Ready master 38m v1.17.2

补充:移除NODE节点的方法
第一步:先将节点设置为维护模式(node-0001是节点名称)
[[email protected] ~]# kubectl drain node-0001 --delete-local-data --force --ignore-daemonsets
node/node-0001 cordoned
WARNING: Ignoring DaemonSet-managed pods: kube-flannel-ds-amd64-ssqcl, kube-proxy-7cnsr
node/node-0001 drained
第二步:然后删除节点
[[email protected] ~]# kubectl delete node node-0001
node “node-0001” deleted
第三步:查看节点
发现node1节点已经被删除了
[[email protected] ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node-0002 Ready 13m v1.17.2
master Ready master 49m v1.17.2
如果这个时候再想添加进来这个node,需要执行两步操作
第一步:停掉kubelet(需要添加进来的节点操作)
[[email protected] ~]# systemctl stop kubelet
第二步:删除相关文件
[[email protected] ~]# rm -rf /etc/kubernetes/*
第三步:添加节点
[[email protected] ~]#kubeadm join 172.20.10.2:6443 --token rn816q.zj0crlasganmrzsr --discovery-token-ca-cert-hash sha256:e339e4dbf6bd1323c13e794760fff3cbeb7a3f6f42b71d4cb3cffdde72179903
第四步:查看节点
[[email protected] ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node-0001 Ready 13s v1.17.2
node-0002 Ready 17m v1.17.2
node-0003 Ready 17m v1.17.2
ken Ready master 53m v1.17.2
忘掉token再次添加进k8s集群
第一步:主节点执行命令
获取token
[[email protected] ~]# kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
ojxdod.fb7tqipat46yp8ti 10h 2020-010-28T04:55:42+08:00 authentication,signing The default bootstrap token generated by ‘kubeadm init’. system:bootstrappers:kubeadm:default-node-token
第二步: 获取ca证书sha256编码hash值
[[email protected] ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed ‘s/^.* //’
6845488cdb01191ff6dbca0edb02dbb21a14469028e4ff511323114a4544c5fa5465
第三步:从节点执行如下的命令
[[email protected] ~]# systemctl stop kubelet
第四步:删除相关文件
[[email protected] ~]# rm -rf /etc/kubernetes/*
第五步:加入集群
指定主节点IP,端口是6443
在生成的证书前有sha256:
[[email protected] ~]# kubeadm join 192.168.64.10:6443 --token ojxdod.fb7tqipat46yp8ti --discovery-token-ca-cert-hash sha256:6845488cdb01191ff6dbca0edb02dbb21a14469028e4ff511323114a4544c5fa5465