目录

一、Kubernetes 简介

Kubernetes 代码托管在 GitHub 上:https://github.com/kubernetes/kubernetes

在这里插入图片描述

1.1、什么是 Kubernetes

  • Kubernetes (通常称为K8s,K8s是将8个字母“ubernete”替换为“8”的缩写) 是用来管理容器(docker)集群的平台。可对集群进行的操作包括部署,调度和集群节点扩展。

  • 每个 Kubernetes 集群都由一个或多个 Master 负责管理和控制集群节点。

  • Master 对每个节点 Node 发送命令。Master 就是管理者,Node 就是被管理者。

  • Node 可以是一台机器或者一台虚拟机。在 Node 上面可以运行多个 Pod,

  • Pod 是 Kubernetes 管理的最小单位,同时每个 Pod 可以包含多个容器(Docker)。

  • 使用Kubernetes可以实现:

    • 自动化容器的部署和复制
    • 随时扩展或收缩容器规模
    • 将容器组织成组,并且提供容器间的负载均衡
    • 很容易地升级应用程序容器的新版本
    • 提供容器弹性,如果容器失效就替换它,等等…

1.2、Kubernetes 核心概念

  • Kubernetes 核心是集群,集群是一组节点,可以分布式的无限扩展。
  • Kubernetes 定义了一组组件,它们可以共同提供部署、维护和扩展应用程序的机制。
  • Kubernetes 的组件设计为松耦合和可扩展的,这样可以满足多种不同的工作负载。

在这里插入图片描述

  • Pod
  • Container(容器)
  • Label(标签)
  • Replication Controller(复制控制器)
  • Service(服务)
  • Node(节点)
  • Kubernetes Master(Kubernetes主节点)

1.2.1、Pod

  • Kubernetes 的最小调度单元称为“pod(上图绿色方框)”。
  • Pod安排在节点上,包含一组容器和卷。
  • 同一个Pod里的容器共享同一个网络命名空间,可以使用 localhost 互相通信。
  • 集群中每个 pod 都被分配一个唯一的IP地址这样就可以允许应用程序使用端口,而不会有冲突的风险。
  • pod 可以通过 Kubernetes API 手动管理,也可以委托给控制器来管理。

1.2.2、标签和标签选择器

  • Kubernetes 使客户端(用户或内部组件)将称为“标签”的键值对附加到系统中的任何 API 对象,如 pod 或 节点。

  • “标签选择器”是针对匹配对象的标签的查询。

  • 标签和选择器是Kubernetes中的主要分组机制,用于确定操作适用的组件。

  • 正如图所示,一些Pod有Label([外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6H0aHOLe-1622099145988)(assets/label.png)])。一个Label是attach到Pod的一对键/值对,用来传递用户定义的属性。比如,你可能创建了一个"tier"和“app”标签,通过Label(tier=frontend, app=myapp)来标记前端Pod容器,使用 Label(tier=backend, app=myapp)标记后台Pod。然后可以使用 Selectors 选择带有特定Label的Pod,并且将 Service 或者 Replication Controller 应用到上面。

1.2.3、控制器

  • 控制器是将实际集群状态转移到所需集群状态的对帐循环。它通过管理一组 pod来实现。

  • 一种控制器是一个“复制控制器”,它通过在集群中运行指定数量的pod副本来处理复制和缩放。如果基础节点出现故障,它还可以处理创建替换 pod。

  • Replication Controller 确保任意时间都有指定数量的Pod“副本”在运行。

    • 如果为某个Pod创建了 Replication Controller并且指定3个副本,它会创建3个Pod,并且持续监控它们。
    • 如果某个Pod不响应,那么 Replication Controller 会替换它,保持总数为3.
    • 如果之前不响应的Pod恢复了,现在就有4个Pod了,那么Replication Controller会将其中一个终止保持总数为3。
    • 如果在运行中将副本总数改为5,Replication Controller会立刻启动2个新Pod,保证总数为5。还可以按照这样的方式缩小Pod,这个特性在执行滚动升级时很有用。
    • 如下面的动画所示始终保证 pod 副本为 3:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qpJLcBwM-1622099145989)(assets/03d07039d9fc80c0f692d6176f65936e.gif)]

  • 当创建Replication Controller时,需要指定两个条件:
    • Pod模板:用来创建Pod副本的模板
    • Label: Replication Controller 需要监控的 Pod 的标签。

1.2.4、服务(负载均衡)

  • Pods 是短暂的,重启时IP地址会改变,怎么才能从前端容器正确可靠地指向后台容器呢?

  • Kubernetes 服务是一组协同工作的 pod,就像多层架构应用中的一层。构成服务的 pod 组通过标签选择器来定义。

  • Kubernetes 通过给 Service 分配静态 IP 地址和域名来提供服务发现机制,并且以轮询调度的方式将流量负载均衡到能与选择器匹配的 pod 的 IP 地址的网络连接上(即使是故障导致pod从一台机器移动到另一台机器)。

  • 默认情况下,一个服务会暴露在集群中(例如,多个后端 pod 可能被分组成一个服务,前端pod的请求在它们之间负载平衡);也可以暴露在集群外部(例如,从客户端访问前端pod)。

  • Service 是定义一系列Pod以及访问这些Pod的策略的一层抽象

  • Service 通过 Label 找到Pod 组。因为 Service 是抽象的,所以在图表里通常看不到它们的存在,这也就让这一概念更难以理解。

  • 假定有2个后台Pod,并且定义后台Service的名称为‘backend-service’,lable 选择器为(tier=backend, app=myapp)。backend-service 的 Service 会完成如下两件重要的事情:

    • 会为 Service 创建一个本地集群的 DNS 入口,因此前端 Pod 只需要 DNS 查找主机名为 ‘backend-service’,就能够解析出前端应用程序可用的IP地址。
    • 现在前端已经得到了后台服务的IP地址,但是它应该访问2个后台Pod的哪一个呢?Service在这2个后台Pod之间提供透明的负载均衡,会将请求分发给其中的任意一个(如下面的动画所示)。通过每个Node上运行的代理(kube-proxy)完成。
    • 下述动画展示了 Service 的功能。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qGb9tgke-1622099145989)(assets/e7a273fcdc03d2417b354b60c253552f.gif)]

1.2.5、Node

  • 节点(上图橘色方框)是物理或者虚拟机器,作为Kubernetes worker,通常称为 Minion。每个节点都运行如下Kubernetes关键组件:
    • Kubelet:是主节点代理。
    • Kube-proxy: Service使用其将链接路由到Pod,如上文所述。
    • Docker: Kubernetes 使用的容器技术来创建容器。

1.2.6、Master

  • 集群拥有一个Kubernetes Master(紫色方框)。
  • Kubernetes Master 提供集群的独特视角,并且拥有一系列组件,比如 Kubernetes API Server。

1.3、Kubernetes 核心组件

  • Kubernetes 遵循 master-slave architecture。

  • Kubernetes Master 是集群的主要控制单元,用于管理其工作负载并指导整个系统的通信。

  • Kubernetes 控制单元由各自的进程组成,每个组件都可以在单个主节点上运行,也可以在支持 high-availability clusters 的多个主节点上运行。

  • Kubernetes 主要由以下几个核心组件组成:

组件名称说明
etcd分布式键值存储系统。用于保存集群状态,比如Pod、Service等对象信息。
apiserver提供了资源操作的唯一入口,各组件协调者,并提供认证、授权、访问控制、API注册和发现等机制;以 HTTPAPI 提供接口服务,所有对象资源的增删改查和监听操作都交给 APIServer 处理后再提交给 Etcd 存储
controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;处理集群中常规后台任务,一个资源对应一个控制器,而 ControllerManager 就是负责管理这些控制器的。
scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
kubeletkubelet 是 Master 在 Node 节点上的 Agent,管理本节点运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet 将每个Pod 转换成一组容器。负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);
kube-proxy负责为Service提供cluster内部的服务发现和负载均衡;在 Node 节点上实现 Pod 网络代理,维护网络规则和四层负载均衡工作。

核心组件结构图

除了核心组件,还有一些常用组件:

组件名称说明
kube-dns负责为整个集群提供DNS服务
Ingress Controller为服务提供外网入口
metrics-server提供资源监控
Dashboard提供 GUI
Fluentd-elasticsearch提供集群日志采集、存储与查询 EFK

二、Kubernetes 集群部署

2.1、环境说明

1、集群服务器规划

主机名IP地址角色系统
k8s-master192.168.120.128k8s-masterCentos7.6
k8s-node1192.168.120.129k8s-nodeCentos7.6
k8s-node2192.168.120.130k8s-nodeCentos7.6
  • 注意:官方建议每台机器至少双核2G内存

2.1.1 分别设置静态IP地址

进入网络配置文件目录
cd /etc/sysconfig/network-scripts/
编辑配置文件
vi ifcfg-ens33

[root@k8s-master ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="eth0"
UUID="662a58e0-f4cb-40d0-a01f-d39a354baaba"
DEVICE="eth0"
ONBOOT="yes"
IPV6_PRIVACY="no"
IPADDR=192.168.120.138
NETMASK=255.255.255.0
GATEWAY=192.168.120.2
DNS1=192.168.120.2

配置完毕重启网络
service network restart

2.1.2 分别修改主机名

三台服务器分别执行
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2

2.1.3 需确保所有服务器 MAC 和 product_uuid 唯一

ifcfg-ens33,不唯一的话,修改,一般都是唯一的

2.1.4 配置 hosts 文件并分发给其他服务器

vi /etc/hosts
追加:
192.168.120.128 k8s-master
192.168.120.129 k8s-node1
192.168.120.130 k8s-node2
保存ping测试—>能ping通
配置文件分发(命令可以参考其他文章)
scp ./hosts k8s-node1:/etc/hosts
scp ./hosts k8s-node2:/etc/hosts
去另外两台服务器ping测试—>能ping通

2.2、环境配置

  • 注意: 以下命令在三台主机上均需运行

2.2.1、设置阿里云yum源(可选)

[root@k8s-master ~]curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@k8s-master ~]yum makecache fast && yum repolist

阿里的近期有点问题,我又设置的163源
http://mirrors.163.com/.help/CentOS6-Base-163.repo

2.2.2、安装依赖包

依赖包

[root@k8s-master ~]yum install -y epel-release conntrack ipvsadm ipset sysstat curl iptables libseccomp
  • y : 就是yes,全部回答yes
  • epel-release:扩展源,为CentOS、Scientific Linux 等提供高质量软件包的项目。装上了epel-release之后,就相当于添加了一个第三方源。
  • conntrack :连接跟踪模块,用来跟踪和记录一个连接的状态,它为经过协议栈的数据包记录状态,这为防火墙检测连接状态提供了参考,同时在数据包需要做NAT时也为转换工作提供便利。
  • ipvsadm :四层的lvs负载均衡,ipvs称之为IP虚拟服务器(IP Virtual Server,简写为IPVS)。是运行在LVS下的提供负载平衡功能的一种技术。可参考:http://www.21yunwei.com/archives/3480
  • ipset : 网络设置工具
  • sysstat :是一个软件包,包含监测系统性能及效率的一组工具,这些工具对于我们收集系统性能数据,比如CPU使用率、硬盘和网络吞吐数据,这些数据的收集和分析,有利于我们判断系统是否正常运行,是提高系统运行效率、安全运行服务器的得力助手
  • curl:与wget差不多,下载工具
  • iptables :网络管理, iptables是隔离主机以及网络的工具,通过自己设定的规则以及处理动作对数据报文进行检测以及处理。 iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个框架的名字叫netfilter。可以参考:https://www.zsythink.net/archives/1199
  • libseccomp:库,docker安装时所依赖的一些库

2.2.3、关闭防火墙

  • 关闭centos7自带的防火墙并且禁止开启自启(不然会拦截端口和限制一些网络策略)
  • 清除网络管理工具iptables 的所有默认规则
  • 打开iptables 的FORWARD策略
    forward:经过路由判断后,目的地不是本机的数据包执行的规则。与nat 和 mangle表相关联很高,与本机没有关联。
    关于iptables可以参考:https://blog.51cto.com/linuxcgi/1965296
[root@k8s-master ~]systemctl stop firewalld && systemctl disable firewalld
[root@k8s-master ~]iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT

2.2.4、关闭 SELinux

字面意思就是安全的linux,其对资源的管控比系统还要细化,建议关闭

# 查看SELinux状态
[root@k8s-master ~]sestatus或者getenforce

# 编辑selinux开启还是关闭
[root@k8s-master ~]vi /etc/selinux/config
# 默认存储在宽容模式下,需要重启生效,不重启不生效

# 执行命令脚本也可以
[root@k8s-master ~]setenforce 0
[root@k8s-master ~]sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

改为disable关闭,然后重启
在这里插入图片描述

2.2.5、关闭 swap分区

Swap分区在系统的物理内存不够用的时候,把硬盘内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap分区中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。

在以前内存小的时候可以使用swap分区,现在计算机内存足够,无需使用swap分区,而且使用swap分区时会严重影响性能,所以关闭

# 关闭swap分区
[root@k8s-master ~]swapoff -a
# 修改配置文件 卸载开机挂载
[root@k8s-master ~]sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

也可以直接vi 注释掉
在这里插入图片描述

2.2.6、加载内核模块

k8s内必须需要负载均衡提供服务,使用的是lvs的模式,需要如下算法到系统里

# 写一个脚本
[root@k8s-master ~]cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
modprobe -- br_netfilter
EOF
# 赋予权限 755
[root@k8s-master ~]chmod 755 /etc/sysconfig/modules/ipvs.modules
# 执行脚本加载我们写入的模块
[root@k8s-master ~]bash /etc/sysconfig/modules/ipvs.modules
  • modprobe ip_vs : lvs基于4层的负载均衡
  • modprobe ip_vs_rr : 轮询
  • modprobe ip_vs_wrr : 加权轮询
  • modprobe ip_vs_sh : 源地址散列调度算法
  • modprobe nf_conntrack_ipv4: 连接跟踪模块
  • modprobe br_netfilter : 网络过滤,遍历桥的数据包由iptables进行处理以进行过滤和端口转发

2.2.7、设置内核参数

# 将如下配置写入内核参数 三台都要配置
[root@k8s-master ~]cat << EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF

# 重载文件使之生效
[root@k8s-master ~]sysctl -p /etc/sysctl.d/k8s.conf
# 打开网络通道ipv4 and ipv6
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
# 打开ipv4的内核转发
net.ipv4.ip_forward=1
# 关闭tcp的timewite回收机制
net.ipv4.tcp_tw_recycle=0
# 虽然swap已经关闭,但是也要在内核级别去禁用swap
vm.swappiness=0
# 内核对内存分配的一种策略 下面有介绍 为了提高集群性能选择了1
vm.overcommit_memory=1
# 关闭内存溢出功能
vm.panic_on_oom=0
# 允许用户监控目录的最大数量,也就是用户最大能打开的目录数量
fs.inotify.max_user_watches=89100
#  允许系统打开的最大文件个数 这个数量其实就是不受限制 防止集群性能因为我们内核的限制而变低
fs.file-max=52706963
# 允许单个进程打开的最大文件个数
fs.nr_open=52706963
# 禁用ipv6功能
net.ipv6.conf.all.disable_ipv6=1
# 设置系统的最大连接数
net.netfilter.nf_conntrack_max=2310720
EOF
  • overcommit_memory 是一个内核对内存分配的一种策略。 具体可见/proc/sys/vm/overcommit_memory下的值

    • overcommit_memory=0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
    • overcommit_memory=1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
    • overcommit_memory=2, 表示内核允许分配超过所有物理内存和交换空间总和的内存
  • net.bridge.bridge-nf-call-iptables 设置网桥iptables网络过滤通告

  • net.ipv4.tcp_tw_recycle 设置 IP_TW 回收

  • vm.swappiness 禁用swap

  • vm.panic_on_oom 设置系统oom(内存溢出)

  • fs.inotify.max_user_watches 允许用户最大监控目录数

  • fs.file-max 允许系统打开的最大文件个数

  • fs.nr_open 允许单个进程打开的最大文件个数

  • net.ipv6.conf.all.disable_ipv6 禁用ipv6

  • net.netfilter.nf_conntrack_max 系统的最大连接数

2.2. 8、安装 Docker

快捷安装:curl -sSL https://get.daocloud.io/docker | sh

1、首先卸载旧版

怕系统存留的一些旧docker版本的组件影响我们搭建集群

[root@k8s-master ~]# yum remove docker \
           docker-client \
           docker-client-latest \
           docker-common \
           docker-latest \
           docker-latest-logrotate \
           docker-logrotate \
           docker-selinux \
           docker-engine-selinux \
           docker-engine
2、安装依赖包
[root@k8s-master ~]yum install -y yum-utils device-mapper-persistent-data lvm2
  • yum-utils:yum管理工具
  • device-mapper-persistent-data:存储的驱动
  • lvm2:逻辑卷管理
3、设置安装源(阿里云)
[root@k8s-master ~]yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4、启用测试库(不需要做)
[root@k8s-master ~]# yum-config-manager --enable docker-ce-edge
[root@k8s-master ~]# yum-config-manager --enable docker-ce-test
5、安装
[root@k8s-master ~]yum makecache fast
# 查看docker所有版本,排序
[root@k8s-master ~]yum list docker-ce --showduplicates | sort -r
# 安装指定版本
[root@k8s-master ~]yum -y install docker-ce-18.09.9-3.el7
6、启动
[root@k8s-master ~]# systemctl start docker
7、配置启动命令
  • 将 iptables FORWARD chain 的默认策略设置为 ACCEPT
    放行docker
# 脚本 在13行加上
[root@k8s-master ~]sed -i "13i ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT" /usr/lib/systemd/system/docker.service
8、修改 docker 配置
  • 修改 Docker 配置镜像仓库配置阿里云镜像加速,Kubeadm 建议将 systemd 设置为 cgroup 驱动
  • “exec-opts”: 系统驱动设置为systemd,控制组去管理
  • “log-driver”:log驱动设置为json文件模式
  • “log-opts”:日志大小,100m的切割日志
  • “storage-driver”:存储驱动,overlay2
  • “storage-opts”:系统内核级别开启驱动检测
[root@k8s-master ~]# tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://bk6kzfqm.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF
9、重新启动 docker 服务
[root@k8s-master ~] systemctl daemon-reload
[root@k8s-master ~] systemctl restart docker
10、docker 服务设置为开机启动(必须设置)
[root@k8s-master ~] systemctl enable docker

2.2. 9、安装集群部署工具

1、配置安装源

添加集群部署工具的yum源
也就是k8s的源,同样设置为阿里的

[root@k8s-master ~] cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
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
EOF
2、刷新 yum 源
[root@k8s-master ~] yum makecache fast
3、安装集群部署工具
  • kubelet :集群的客户端
  • kubeadm :整个部署工具的主程序
  • kubectl:k8s集群管理的核心命令
[root@k8s-master ~] yum install -y kubelet kubeadm kubectl
4、设置 kubelet 开机自启
  • 注意:切记不需要 start
[root@k8s-master ~] systemctl enable kubelet

2.2.10、拉取所需镜像

拉取初始化集群所需要的镜像
先从阿里云拉取所需的镜像,不然会从谷歌拉取,导致拉取失败。

1、查看部署集群需要的镜像
[root@k8s-master ~]kubeadm config images list 
2、拉取镜像

采用一种曲线救国的方式,因为无法从谷歌仓库拉取,而搭建集群又需要name为国外名字的镜像

# 替换名称 替换成阿里的镜像拉取
[root@k8s-master ~]kubeadm config images list | sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#registry.cn-hangzhou.aliyuncs.com/google_containers#g' | sh -x

# 拉取完毕后 将名字改回谷歌的名字
[root@k8s-master ~]docker images | grep registry.cn-hangzhou.aliyuncs.com/google_containers | awk '{print "docker tag",$1":"$2,$1":"$2}' | sed -e 's/registry.cn-hangzhou.aliyuncs.com\/google_containers/k8s.gcr.io/2' | sh -x

# 把多余的阿里云的镜像删除
[root@k8s-master ~]docker images | grep registry.cn-hangzhou.aliyuncs.com/google_containers | awk '{print "docker rmi """$1""":"""$2}' | sh -x 
3、Master 导出镜像
[root@k8s-master ~]# docker save $(docker images | grep -v REPOSITORY | awk 'BEGIN{OFS=":";ORS=" "}{print $1,$2}') -o k8s-images.tar
4、node 节点导入镜像
[root@k8s-node1 ~]# docker image load -i k8s-images.tar

2.3、初始化集群(均在k8s-master上执行)

  • 注意: 以下命令如无特殊说明,均在k8s-master上执行

1、初始化集群(注意修 apiserver 地址为本机IP)

[root@k8s-master ~] kubeadm init  --kubernetes-version=v1.17.3 --apiserver-advertise-address=192.168.152.134 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.1.0.0/16
  • –kubernetes-version=v1.17.0 : 指明k8s的版本,加上该参数后启动相关镜像(刚才下载的那一堆)

  • -apiserver-advertise-address=192.168.152.134:master节点的ip

  • –pod-network-cidr=10.244.0.0/16 :网段可以自定义,掩码必须16,因为k8s集群中使用到的ip非常多,24位的掩码无法满足需求(Pod 中间网络通讯我们用flannel,flannel要求是10.244.0.0/16,这个IP段就是Pod的IP段)

  • –service-cidr=10.1.0.0/16 : Service(服务)网段(和微服务架构有关)

  • 初始化成功后会输出加入集群的令牌,暂时无需运行,先记录。

kubeadm join 192.168.120.128:6443 --token duz8m8.njvafly3p2jrshfx --discovery-token-ca-cert-hash sha256:60e15ba0f562a9f29124914a1540bd284e021a37ebdbcea128f4e257e25002db

2、配置 kubectl 用户使用环境

# 把密钥配置加载到自己的环境变量里
[root@k8s-master ~] export KUBECONFIG=/etc/kubernetes/admin.conf

# 每次启动自动加载$HOME/.kube/config下的密钥配置文件(K8S自动行为)
# 添加系统变量
[root@k8s-master ~] mkdir -p $HOME/.kube
# 复制配置文件
[root@k8s-master ~] sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 修改权限 600 如果不对 集群也无法启动
[root@k8s-master ~] sudo chown $(id -u):$(id -g) $HOME/.kube/config

初始token令牌需要记住,其余节点加入的时候需要使用

3、 集群网络配置

1、安装 flannel 网络

注意:修改集群初始化地址及镜像能否拉去

[root@k8s-master ~] wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
[root@k8s-master ~] kubectl apply -f kube-flannel.yml
  • 使用下面的命令确保所有的Pod都处于Running状态,需要等待网络初始化完成。
[root@k8s-master ~] kubectl get pod --all-namespaces -o wide
2、安装 calico 网络
  • 注意修该集群初始化地址,需要等待网络初始化完成
[root@k8s-master ~] wget https://docs.projectcalico.org/v3.10/manifests/calico.yaml
[root@k8s-master ~] kubectl apply -f  calico.yaml

4、Kubernetes 集群添加节点

  • 在 k8s-node1 和 k8s-node2 上运行之前在 k8s-master 输出的命令
[root@k8s-node1 ~] kubeadm join 192.168.120.128:6443 --token duz8m8.njvafly3p2jrshfx --discovery-token-ca-cert-hash sha256:60e15ba0f562a9f29124914a1540bd284e021a37ebdbcea128f4e257e25002db
  • 注意:没有记录集群 join 命令的可以通过以下方式重新获取
[root@k8s-master ~] kubeadm token create --print-join-command --ttl=0

5、查看集群中的节点状态

  • 等待全为 Ready
[root@k8s-master ~] kubectl get nodes

三、Kubernetes 集群管理

3.1、kubectl 命令补全

3.1.1、master 安装命令补全(临时生效)

[root@k8s-master ~] yum install -y bash-completion
[root@k8s-master ~] source /usr/share/bash-completion/bash_completion

3.1.2、永久生效

[root@k8s-master ~] source <(kubectl completion bash)
[root@k8s-master ~] echo "source <(kubectl completion bash)" >> ~/.bashrc

3.2、kubectl 获取帮助

[root@k8s-master ~]# kubectl --help

3.3、kubectl 状态查看命令

3.3.1、查看集群信息

[root@k8s-master ~]# kubectl cluster-info   	# 集群基本信息
[root@k8s-master ~]# kubectl cluster-info dump 	# 集群详细信息

3.3.2、查看各组件信息

[root@k8s-master ~]# kubectl get cs

3.3.3、查看各服务信息

[root@k8s-master ~]# kubectl get svc

3.3.4、查看节点信息

[root@k8s-master ~]# kubectl get nodes
[root@k8s-master ~]# kubectl get nodes -o wide
[root@k8s-master ~]# kubectl get nodes -o yaml

3.4、集群 pod 管理

3.4.1、创建 pod 资源

1、定义 pod 的 yaml 文件
[root@k8s-master ~]# vim pod-demo.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  labels:
    name: myapp
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
2、用 yuml 文件创建 pod 资源
[root@k8s-master ~]#  kubectl create -f pod-demo.yaml
  • create 直接创建资源(无法直接更新,更新需删除再创建)
  • apply 声明式创建(创建+更新,可以重复使用)
  • –force 强制模式

3.4.2、查看 pod 信息

[root@k8s-master ~]# kubectl get pods

3.4.3、查看 pod 所运行节点

[root@k8s-master ~]# kubectl get pods -o wide

3.4.4、查看 pod 定义的详细信息

[root@k8s-master ~]# kubectl get pods -o yaml
  • spec: 定义期望的目标状态,用户定义时使用的核心字段;用户期望的目标状态
  • status:当前状态,是由 kubernetes 系统自动维护,管理员不能人为修改;
  • kubernetes 的核心目标在于:让每个资源的当前状态无限接近于由用户定义的目标状态;

3.4.5、进入 pod 中的容器

[root@k8s-master ~]# kubectl exec -it pod-1 -c myapp -- /bin/sh 

3.4.6、查看 pod 的详细状态

[root@k8s-master ~]# kubectl describe pod-1 -n default

3.4.7、查看指定 pod 的日志

[root@k8s-master ~]# kubectl logs pod-1 myapp
# 从详细信息里获取ip地址
[root@k8s-master ~]# curl ip
# 再次查看日志
[root@k8s-master ~]# kubectl logs pod-1 myapp

3.4.8、删除 pod 资源

[root@k8s-master ~]# kubectl delete pods pod-1
[root@k8s-master ~]# kubectl delete -f pod-demo.yaml   # 清单删除

3.5、kubectl 动态扩容

3.5.1、kubectl run 创建 deployment 控制器指定的镜像创建 pod 资源

[root@k8s-master ~]# kubectl run nginx --image=nginx:1.12 --port=80 --replicas=2

3.5.2、kubectl expose 创建 service 资源,用于为 pod 提供固定访问端点

注意: 服务发布完修改首页验证负载

[root@k8s-master ~]# kubectl expose deployment nginx --port=8000 --target-port=80
[root@k8s-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort --target-port=80 --name=nginx-service
  • –port:宿主机暴露出去的端口
  • –type=NodePort:使用结点+端口方式访问服务
  • –target-port:容器的端口
  • –name:创建service指定的名称
[root@k8s-master ~]# kubectl exec -it nginx-76d5b5f476- -- /bin/bash
nginx-76d5b5f476-4xw2k  nginx-76d5b5f476-d68zd  nginx-76d5b5f476-dj6lr  nginx-76d5b5f476-zfnxv  
[root@k8s-master ~]# kubectl exec -it nginx-76d5b5f476- -- /bin/bash
nginx-76d5b5f476-4xw2k  nginx-76d5b5f476-d68zd  nginx-76d5b5f476-dj6lr  nginx-76d5b5f476-zfnxv  
[root@k8s-master ~]# kubectl exec -it nginx-76d5b5f476-dj6lr -- /bin/bash
root@nginx-76d5b5f476-dj6lr:/# cd /usr/share/nginx/html/
root@nginx-76d5b5f476-dj6lr:/usr/share/nginx/html# ls
50x.html  index.html
root@nginx-76d5b5f476-dj6lr:/usr/share/nginx/html# mv index.html{,.bak}
root@nginx-76d5b5f476-dj6lr:/usr/share/nginx/html# echo 'nginx01'>index.html
root@nginx-76d5b5f476-dj6lr:/usr/share/nginx/html# exit
exit

3.5.3、kubectl scale 实现应用扩缩容

[root@k8s-master ~]# kubectl get pods
[root@k8s-master ~]# kubectl scale --current-replicas=2 --replicas=3 deployment nginx
[root@k8s-master ~]# kubectl get pods

3.5.4、kubectl set image 升级应用(指定升级的镜像版本)

[root@k8s-master ~]# kubectl set image deployment nginx nginx=nginx:1.14
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐