搭建k8s集群
目录一、Kubernetes 简介1、什么是 Kubernetes3、Kubernetes 核心概念1、Pod2、标签和标签选择器3、控制器4、服务(负载均衡)5、Node6、Master5、Kubernetes 核心组件二、Kubernetes 集群部署1、环境说明1.1 分别设置静态IP地址1.2 分别修改主机名1.3 需确保所有服务器 MAC 和 product_uuid 唯一1.4 配置
目录
- 一、Kubernetes 简介
- 二、Kubernetes 集群部署
- 三、Kubernetes 集群管理
一、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:
- 当创建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 的功能。
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调度到相应的机器上; |
kubelet | kubelet 是 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-master | 192.168.120.128 | k8s-master | Centos7.6 |
k8s-node1 | 192.168.120.129 | k8s-node | Centos7.6 |
k8s-node2 | 192.168.120.130 | k8s-node | Centos7.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
更多推荐
所有评论(0)