Day72
Kubernetes master概述
kubernetes概述
kubebnets介绍
kubectl是谷歌研发的大规模容器管理技术Borg的开源管理Borg的开源版本。可以简写为k8s.
K8S的用途
k8s是一套能够对容器进行更高级更灵活的编排管理和调度等操作的系统。
K8s是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动化扩容缩容、维护等功能。
Kubernetes适用场景
有大量跨主机的容器需要管理
快速部署应用、
快速扩展应用
无缝对接新应用的功能
节省资源,优化硬件资源的使用
Kubernetes架构
核心角色
master(管理节点)
node(计算节点)
image(镜像仓库)
master架构解析
naster是做什么的
Master提供集群的控制,对集群进行全局决策,检测和响应集群事件,Master主要有apiserver,kuberproxy,scheduler,contorllermanager和etcd服务组成
master节点服务
API Server
是整个系统对外的接口,供客户端和其他组件调用,后端元数据存储在etcd中(键值数据库)
Scheduler
负责对集群内部资源进行调度,相当于调度室
Controller manager
负责管理控制器,相当于大总管
etcd
etcd的定义:
etcd是CoreOS发起的开源项目,它的目标是构建一个高可用的分布式键值数据库,基于Go语言实现,在分布式系统中,各种服务的配置信息的管理分享,服务发现是一个很基本同时也很重要的问题。
kubernetes在运行过程中产生的元数据全部存储在etcd中
etcd键值管理
在键的组织上etcd采用了层次化的空间结构(类似于文件系统中,目录的概念),用户指定的键可以为单独的名字,也可以指定目录结构
etcd有kubernetes集群自动管理,无需用户手动干预
etcdctl是etcd的客户端管理程序
Kubernetes master
准备工作
基础知识
官网:https://kubernetes.io/
源码&二进制
下载源码或编译好的二进制,手工添加参数启动服务
kubernetes采用证书认证的方式,需要创建大量证书
容器
官方把服务做成镜像,下载镜像、启动镜像即可
官方工具kuberadm采用的方式
部署环境要求
内核版本>=3.10
最低配置2cpu,2G内存
节点之间不可以有重复的主机名、MAC地址或者product_uuid
卸载防火墙,禁用swap 禁用selinux
服务端口
协议 | 端口范围 | 软件 | 用途 |
---|---|---|---|
TCP | 6443 | kube-apiserver | 所有组件接口服务 |
TCP | 2379-2380 | ectd | kuber-api,etcd服务 |
TCP | 10250 | kubelet | kubelet服务 |
TCP | 10251 | kube-scheduler | kube-scheduler服务 |
TCP | 10252 | kube-controller-manager | kube-controller-mamnger服务 |
机器列表
kubeadm的YUM仓库
官网下载地址:https://packages.cloud.google.com/
kube-master安装
1、防火墙相关配置
参考前面知识点完成禁用 selinux,禁用 swap,卸载 firewalld-*
2、配置yum仓库
[root@ecs-proxy ~]# cp -a v1.17.6/k8s-install /var/ftp/localrepo/
[root@ecs-proxy ~]# cd /var/ftp/localrepo/
[root@ecs-proxy localrepo]# createrepo --update .
3、安装工具软件包
安装kubeadm、kubectl、kubelet、docker-ce
kubeadm:用来初始化集群命令的指令
kubelet:在集群中的每个节点上来启动pod和容器等
kubectl:用来与集群通信的命令行工具
docker:容器管理工具
[root@master ~]# yum makecache
[root@master ~]# yum install -y kubeadm kubelet kubectl docker-ce
[root@master ~]# mkdir -p /etc/docker
[root@master ~]# 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"]
}
[root@master ~]# systemctl enable --now docker kubelet
[root@master ~]# docker info |grep Cgroup
Cgroup Driver: systemd
[root@master ~]# 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 #开启路由转发
[root@master ~]# modprobe br_netfilter
[root@master ~]# sysctl --system
kubeadm介绍
kubeadm 命令
config:配置管理命令
help:查看帮助
init:初始命令
join:node加入集群的命令
reset:还原状态命令
token: token凭证管理命令
version:查看版本
镜像管理
镜像管理
kubernetes v1.17.6 推荐的部署方式是使用镜像
kubernetes的master各个服务是运行在容器内的
镜像有多个,获取镜像的方法
4、镜像导入私有仓库
# 把云盘 kubernetes/v1.17.6/base-images 中的镜像拷贝到 master
[root@master ~]# cd base-images/
[root@master base-image]# for i in *.tar.gz;do docker load -i ${i};done
[root@master base-image]# docker images
[root@master 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
# 查看验证
[root@master base-image]# curl http://192.168.1.100:5000/v2/_catalog
5、Tab键设置
kubectl、kuberadm支持自动补全功能,节省大量输入
自动补全脚本由kubectl、kubeadm产生,仅需要在您的shell配置文件中调用即可。
配置完需要退出重新登录才会生效
[root@master ~]# kubectl completion bash >/etc/bash_completion.d/kubectl
[root@master ~]# kubeadm completion bash >/etc/bash_completion.d/kubeadm
[root@master ~]# exit
kube-peoxy代理
kube-proxy是实现Kubernetes Service的通讯与负载均衡的重要组件
kube-proxy代理模式
v1.0,用户空间代理模式
v1.1,iptables模式代理
v1.8,ipvs代理模式如果不安组条件退回至iptables的代理模式
IPVS代理模式
启用条件:
1.内核必须支持ip_vs,ip_vs_rr,ip_vs_wrr,ip_vs_sh,nf_conntrack_ipv4
-
必须有ipvsadm和ipset软件包
-
配置文件中开启IPVS参数
mode:ipvs
6、安装IPVS代理软件包
[root@master ~]# yum install -y ipvsadm ipset
7、系统初始化,排错、
根据提示排错若干
[root@master ~]# 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
[root@master ~]# kubeadm init --dry-run
注:–dry-run(排错,可以用来检测环境)
配置文件:
默认的语法配置
kubeadm config print init-defaults
默认配置中不会输出组件的配置参数,如果想了解组件的配置参数可以使用参数–component-configs组件参数
可用值:[KubeproxyConfiguration kubeletConfiguration]
8、使用kubeadm部署
应答文件在云盘的 kubernetes/v1.17.6/config 目录下
[root@master ~]# mkdir init;cd init
# 拷贝 kubeadm-init.yaml 到 master 云主机 init 目录下
[root@master init]# kubeadm init --config=kubeadm-init.yaml |tee master-init.log
# 根据提示执行命令
[root@master init]# mkdir -p $HOME/.kube
[root@master init]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master init]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
9、验证安装结果
[root@master ~]# kubectl version
[root@master ~]# kubectl get componentstatuses
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health":"true"}
计算节点安装、
kubenetes nosde是做什么的?
是运行容器的实际节点维护Pod,并提供具体的运行环境
nod由kubelet、kuber-proxy和docket组成
计算节点被设计成为水平拓展,该组件在多个节点上运行
node节点服务
Docker:容器管理
Kubelet:主要负责监视指派到它的容器,包括创建、修改、删除等
kube-proxy:主要负责为容器对象提供代理,实现service通信与负载均衡。
1、获取token
token管理
如何获取token
管理token使用kubeadm token指令
列出token
kubeadm roken list
删除token
kubeadm token delete
创建token
kubeadm token create
创建时参数:–print-join-command 直接打印安装命令
--ttl设置token生命周期,0为无限
# 创建token
[root@master ~]# kubeadm token create --ttl=0 --print-join-command
[root@master ~]# kubeadm token list
# 获取token_hash
[root@master ~]# 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 到跳板机
[root@ecs-proxy ~]# cd node-install/
[root@ecs-proxy 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
[root@ecs-proxy node-install]# vim node_install.yaml
... ...
vars:
master: '192.168.1.21:6443'
token: 'fm6kui.mp8rr3akn74a3nyn'
token_hash: 'sha256:f46dd7ee29faa3c096cad189b0f9aedf59421d8a881f7623a543065fa6b0088c'
... ...
[root@ecs-proxy node-install]# ansible-playbook node_install.yaml
3、验证安装
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 130m v1.17.6
node-0001 NotReady <none> 2m14s v1.17.6
node-0002 NotReady <none> 2m15s v1.17.6
node-0003 NotReady <none> 2m9s v1.17.6
手动部署计算节点(以node-0001为例)
1)关闭防火墙和SELinux。
[root@node-0001 ~]# vim /etc/selinux/config... ...SELINUX=disabled
[root@node-0001 ~]# yum -y remove firewalld-*... ...
[root@node-0001 ~]# reboot... ...
[root@node-0001 ~]# sestatus SELinux status: disabled
2)配置YUM源
[root@node-0001 ~]# vim /etc/yum.repos.d/local.repo
[local_repo]
name=CentOS-$releasever – Localrepo
baseurl=ftp://192.168.1.252/localrepo
enabled=1
gpgcheck=0
3)如果系统中有swap交换分区的话,则禁用该分区,可以在/etc/fstab中禁用。
4)安装软件
[root@node-0001 ~]# yum install -y kubeadm kubelet docker-ce
5)安装IPVS代理
[root@node-0001 ~]# yum install -y ipvsadm ipset
6)修改docker配置,指定使用私有镜像仓库
[root@node-0001 ~]# 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"]
}
7)修改内核参数
[root@node-0001 ~]# vim /etc/sysctl.d/k8s.conf #没有该文件,需要新建文件
net.bridge.bridge-nf-call-ip6tables = 1 # 开启桥设备内核监控(ipv6)
net.bridge.bridge-nf-call-iptables = 1 # 开启桥设备内核监控
(ipv4)net.ipv4.ip_forward = 1 # 开启路由转发
[root@node-0001 ~]# modprobe br_netfilter #加载内核模块
[root@node-0001 ~]# sysctl --system # 加载上面的k8s.conf配置文件
* Applying /etc/sysctl.d/k8s.conf ...
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1... ...
8)修改/etc/hosts
[root@node-0001 ~]# vim /etc/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.34 node-0004
192.168.1.35 node-0005
步骤二:将node加入K8s集群
1)启动服务器(在node-0001主机操作)
[root@node-0001 ~]# systemctl enable --now docker kubelet
2)查看日志查找下面这一行安装指令的样例(在master主机操作)
kubeadm join 192.168.1.21:6443 --token <token> \--discovery-token-ca-cert-hash sha256: <token ca hash>
3)如何获取Token Hash值(在master主机操作)
[root@master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | \
openssl rsa -pubin -outform der |openssl dgst -sha256 -hex
writing RSA key
(stdin)=f46dd7ee29faa3c096cad189b0f9aedf59421d8a881f7623a543065fa6b0088c
4)如何获取Token(在master主机操作)
[root@master ~]# kubeadm token list # 列出 token
[root@master ~]# kubeadm token delete <token> # 删除 token
[root@master ~]# kubeadm token create # 创建 token
[root@master ~]# kubeadm token create --ttl=0 --print-join-command
... ...
kubeadm join 192.168.1.21:6443 --token fm6kui.mp8rr3akn74a3nyn --discovery-token-ca-cert-hash
sha256:f46dd7ee29faa3c096cad189b0f9aedf59421d8a881f7623a543065fa6b0088c
5)安装node节点(在node-0001主机操作)
使用刚刚生成的token指令完成node节点安装,下面的Toen和Hash值不能照抄。
[root@node-0001 ~]# kubeadm join 192.168.1.21:6443 --token \
fm6kui.mp8rr3akn74a3nyn --discovery-token-ca-cert-hash sha256:f46dd7ee29faa3c096cad189b0f9aedf59421d8a881f7623a543065fa6b0088c
k8s网络插件
flannel实质上是一种覆盖网络也就是将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持UDP、VxLAN、AWS、VPC和GCE路由等数据转发方式。
使用flannel目的是不同主机内的容器实现互联互通
flannel镜像
软件地址:https://github.com/coreos/flannel
资源文件:kube-flannel.yml
镜像文件:flannel.tar.gz
网络插件安装配置
拷贝云盘 kubernetes/v1.17.6/flannel 目录到 master 上
1、上传镜像到私有仓库
[root@master ~]# cd flannel
[root@master flannel]# docker load -i flannel.tar.gz
[root@master flannel]# docker tag quay.io/coreos/flannel:v0.12.0-amd64 192.168.1.100:5000/flannel:v0.12.0-amd64
[root@master flannel]# docker push 192.168.1.100:5000/flannel:v0.12.0-amd64
2、修改配置文件并安装
只需要在master安装,其他节点会自动完成适配。
[root@master 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-结尾: 删除
[root@master flannel]# kubectl apply -f kube-flannel.yml
3、验证结果
等待几分钟后,nod节点会变成Ready
[root@master flannel]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 26h v1.17.6
node-0001 Ready <none> 151m v1.17.6
node-0002 Ready <none> 152m v1.17.6
node-0003 Ready <none> 153m v1.17.6
需要在master安装,其他节点会自动完成适配。
[root@master 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-结尾: 删除
[root@master flannel]# kubectl apply -f kube-flannel.yml
3、验证结果
等待几分钟后,nod节点会变成Ready
[root@master flannel]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 26h v1.17.6
node-0001 Ready <none> 151m v1.17.6
node-0002 Ready <none> 152m v1.17.6
node-0003 Ready <none> 153m v1.17.6