容器_Docker ( 03 )
解密云原生 - 集群概述
kubernetes概述
kubernetes起源
- 如果想要将docker应用于具体的业务实现 , 是存在困难的 – 编排, 管理和调度等各个方面 , 都不容易.于是 , 人们迫切需要一套管理系统 , 对docker及容器进行更高级更灵活的管理 , 于是
kubernetes
出现了 - 俗称
K8S
K8S
- K8S是google 2014年创造的
- K8Sbuingbushi全新的发明 , 是google10多年大规模容器管理技术
Borg
的开源版本 - K8S是容器集群管理系统 , 是一个开源的平台 , 可以实现容器集群的自动化部署 , 自动化扩缩容 , 自维护等功能
k8s集群架构
- 核心架构
master
(管理节点) : 管理和角色node
(计算节点) : 具体操作image
(镜像仓库) : 具体镜像
角色与功能
- Master功能
- 提供集群的控制
- 对集群进行全局决策
- 检测和响应集群事件
- Master节点核心组件
API Server
- 是整个系统的对外接口 , 供客户端和其他组件调用
- 后端元数据存储与
etcd
中
Scheduler
- 负责对集群内部的资源进行分配和调度
ControllerManager
- 负责管理控制器 , 相当于"大总管"
etcd
- 构建一个高可用的分布式键值数据库 , 基于Go语言实现
kubernetes
在运行过程中产生的元数据全部存储在etcd中
- Node功能
- 运行容器的实际节点
- 提供运行环境
- 在多个节点上运行
- 水平扩展
- Node核心组件
kubelet
- 负责监视
pod
, 包括创建 , 修改 , 删除等
- 负责监视
kube-proxy
- 主要负责为
Pod
对象提供代理 - 实现sevice的通信与负载均衡
- 主要负责为
Runtime
- 容器管理
- 镜像仓库
- 存储镜像
- 为节点提供镜像支持
- 仓库组件
Registry
Harbor
安装部署控制节点
安装控制节点
部署概述
- 官网 :
https://kubernetes.io
- 安装部署方式 (两种)
- 源码部署 : 下载源码或编译好的二进制 , 手工添加参数启动服务 , kubernetes采用证书认证方式 , 需要创建大量整数
- 容器部署 : 官方把服务做成"镜像" , 下载镜像 , 启动即可
- 官方工具kuberadm采用的方式
部署概述
- 内核版本 >= 3.10
- 最低配置 2cpu , 2G内存
- 节点之中不可以有重复的主机名 , MAC地址或
product_uuid
- 卸载防火墙
- 禁用 swap
主机清单
主机名 | IP地址 | 最低配置 |
---|---|---|
master | 192.168.1.50 | 2CPU,4G内存 |
node-0001 | 192.168.1.51 | 2CPU,4G内存 |
node-0002 | 192.168.1.52 | 2CPU,4G内存 |
node-0003 | 192.168.1.53 | 2CPU,4G内存 |
node-0004 | 192.168.1.54 | 2CPU,4G内存 |
node-0005 | 192.168.1.55 | 2CPU,4G内存 |
harbor | 192.168.1.30 | 2CPU,4G内存 |
验证镜像仓库状态
1. 配置软件仓库
- 官网下载地址 :
https://packages.cloud.google.com
- 配置软件包仓库
- 添加docker到软件包仓库
- 添加 kubernetes/packages 到软件包仓库
[root@ecs-proxy s4]# rsync -av docker/ /var/localrepo/docker/
[root@ecs-proxy s4]# rsync -av kubernetes/packages/ /var/localrepo/k8s/
[root@ecs-proxy s4]# createrepo --update /var/localrepo/
2. 系统环境配置
# 禁用 firewall 和 swap
[root@master ~]# sed '/swap/d' -i /etc/fstab
[root@master ~]# swapoff -a
[root@master ~]# dnf remove -y firewalld-*
3. 安装软件包
kubeadm
集群配置工具kubelet
管理pod , 在集群中的每个节点上启动kubectl
与集群通信的命令行工具containerd
容器管理软件ipvsadm
集群管理工具iproute-tc
网络流量管理工具
# 添加主机信息
[root@master ~]# vim /etc/hosts
192.168.1.30 harbor
192.168.1.50 master
192.168.1.51 node-0001
192.168.1.52 node-0002
192.168.1.53 node-0003
192.168.1.54 node-0004
192.168.1.55 node-0005
#安装软件包
[root@master ~]# dnf install -y kubeadm kubelet kubectl containerd.io ipvsadm ipset iproute-tc
4. 配置 containerd
# 生成默认配置文件
[root@master ~]# containerd config default >/etc/containerd/config.toml
[root@master ~]# vim /etc/containerd/config.toml
61: sandbox_image = "harbor:443/k8s/pause:3.9" #配置根容器镜像地址
125: SystemdCgroup = true #配置cgroup管理驱动 , 必须与kubelet一致
154 行新插入: #配置私有镜像仓库
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://harbor:443"] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor:443"]
endpoint = ["https://harbor:443"] [plugins."io.containerd.grpc.v1.cri".registry.configs."harbor:443".tls]
insecure_skip_verify = true
# 启动服务
[root@master ~]# systemctl enable --now kubelet containerd
5. 配置内核参数
[root@master ~]# cat >/etc/modules-load.d/containerd.conf<<EOF
overlay # overlay文件系统模块
br_netfilter # 网桥防火墙模块
xt_conntrack # 链接跟踪表模块
EOF
[root@master ~]# systemctl start systemd-modules-load.service
# 设置内核参数
[root@master ~]# cat >/etc/sysctl.d/99-kubernetes-cri.conf<<EOF
net.ipv4.ip_forward = 1 #开启路由转发
net.bridge.bridge-nf-call-iptables = 1 #开启桥流量监控
net.bridge.bridge-nf-call-ip6tables = 1 #开启桥流量监控
net.netfilter.nf_conntrack_max = 1000000 #设置链接跟踪表大小
EOF
[root@master ~]# sysctl -p /etc/sysctl.d/99-kubernetes-cri.conf
6. 导入k8s镜像
- 如何获取镜像
- 使用 kubeadm管理工具可以查询镜像信息
- 在可以访问官方镜像仓库的机器上使用 docker pull 下载
[root@master ~]# kubeadm config images list
registry.k8s.io/kube-apiserver:v1.26.0
registry.k8s.io/kube-controller-manager:v1.26.0
registry.k8s.io/kube-scheduler:v1.26.0
registry.k8s.io/kube-proxy:v1.26.0
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.6-0
registry.k8s.io/coredns/coredns:v1.9.3
- 导入镜像 :
- 拷贝
lubernetes/init
目录到 master - 安装docker软件包
- 拷贝
# 拷贝本阶段 kubernetes/init 目录到 master
[root@ecs-proxy s4]# rsync -av kubernetes/init 192.168.1.50:./
[root@master ~]# dnf install -y docker-ce
[root@master ~]# mkdir -p /etc/docker
[root@master ~]# vim /etc/docker/daemon.json
{
"registry-mirrors":["https://harbor:443"],
"insecure-registries":["harbor:443"]
}
[root@master ~]# systemctl enable --now docker
- 导入镜像到harbor仓库
# 登录 harbor 仓库,上传镜像
[root@master ~]# docker login harbor:443
Username: admin
Password: ********
Login Succeeded
[root@master ~]# docker load -i init/v1.26.0.tar.xz
#打标签 , 上传到harbor仓库
[root@master ~]# docker images|while read i t _;do
[[ "${t}" == "TAG" ]] && continue
[[ "${i}" =~ ^"harbor:443/".+ ]] && continue
docker tag ${i}:${t} harbor:443/k8s/${i##*/}:${t}
docker push harbor:443/k8s/${i##*/}:${t}
docker rmi ${i}:${t} harbor:443/k8s/${i##*/}:${t}
done
初始化主控值节点
1. 自动补全设置 , 设置tab键
kubectl , kubeadm
支持自动补全功能 , 可以节省大量输入- 自动补全脚本由
kubectl , kubeadm
产生 名仅需要在shell
配置文件中调用即可
[root@master ~]# source <(kubeadm completion bash|tee /etc/bash_completion.d/kubeadm)
[root@master ~]# source <(kubectl completion bash|tee /etc/bash_completion.d/kubectl)
2. 安装环境验证
- 如果
error.log
为空 , 代表配置正确 - 如果
error.log
有报错 , 排除错误后在重新执行验证指令 , 直到配置正确
# 测试系统环境
[root@master ~]# kubeadm init --config=init/init.yaml --dry-run 2>error.log
[root@master ~]# cat error.log
[root@master ~]# rm -rf error.log /etc/kubernetes/tmp
3. 初始化主节点
# 主控节点初始化
[root@master ~]# kubeadm init --config=init/init.yaml |tee init/init.log
4. 验证集群
# 管理授权
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 验证安装结果
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 19s v1.26.0
calico插件
calico概述
- 在虚拟化平台中 , 比如
OpenStack , Docker
等都需要实现workload
之间互连 , 但同时也需要对容器做隔离控制 , 设置访问策略 .calico
就可以解决以上所有问题 - calico可以让不同节点上的容器实现互联互通 , 同时也可以设置访问策略 , 他是一种容器之间网络互通的解决方案
calico优势
- 更节约资源 : Calico使用三层路由方法 , 抑制二层广播 , 减少了资源开销 , 并且具有可扩展性
- 更容易管理 : 因为没有隧道 , 意味着workloads之间路径更短更简单 , 配置更少 , 更容易管理
- 更少的依赖 : Calico仅依赖三层路由可达
- 适配性广 : 较少的依赖性使它能够适配所有 VM , Container . 白盒或者混合环境场景
calico安装
-
calico主页地址
https://github.com/projrctcalico/calico
# 拷贝本阶段 kubernetes/plugins 目录到 master
[root@ecs-proxy s4]# rsync -av kubernetes/plugins 192.168.1.50:.
[root@ecs-proxy s4]# tree plugins/calico
1. 导入镜像到私有仓库
- 导入完成后 , 通过harbor页面验证导入结果
[root@master ~]# cd plugins/calico
[root@master calico]# docker load -i calico.tar.xz
[root@master calico]# docker images|while read i t _;do
[[ "${t}" == "TAG" ]] && continue
[[ "${i}" =~ ^"harbor:443/".+ ]] && continue
docker tag ${i}:${t} harbor:443/plugins/${i##*/}:${t}
docker push harbor:443/plugins/${i##*/}:${t}
docker rmi ${i}:${t} harbor:443/plugins/${i##*/}:${t}
done
2. 修改资源对象文件中镜像的地址
[root@master calico]# sed -ri 's,^(\s*image: )(.*/)?(.+),\1harbor:443/plugins/\3,' calico.yaml
4443: image: docker.io/calico/cni:v3.25.0
4471: image: docker.io/calico/cni:v3.25.0
4514: image: docker.io/calico/node:v3.25.0
4540: image: docker.io/calico/node:v3.25.0
4757: image: docker.io/calico/kube-controllers:v3.25.0
3. 使用资源对象文件安装插件
[root@master calico]# kubectl apply -f calico.yaml
[root@master calico]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 23m v1.26.0
Kubeadm工具
token管理
-
node节点如何加入集群
-
从master的安装日志里查找安装指令样例
kubeadm join 192.168.1.50:6443 --token <token> --discovery-token-ca-cert-hash sha256: <token ca hash>
-
- node节点向加入集群必须有master提供token
token
相当于证明文件token-ca-cert-hash
验证文件的真伪
token 管理命令
- 可选参数
--print-join-command
直接打印安装命令 - 可选参数
--ttl
设置token
生命周期 , 0 为无限
1. 获取凭证
# 创建 token
[root@master ~]# kubeadm token create --ttl=0 --print-join-command
kubeadm join 192.168.1.50:6443 --token fhf6gk.bhhvsofvd672yd41 --discovery-token-ca-cert-hash sha256:ea07de5929dab8701c1bddc347155fe51c3fb6efd2ce8a4177f6dc03d5793467
2. 查询删除token
# 查看 token
[root@master ~]# kubeadm token list
TOKEN TTL EXPIRES
abcdef.0123456789abcdef 23h 2022-04-12T14:04:34Z
# 删除 token
[root@master ~]# kubeadm token delete abcdef.0123456789abcdef
bootstrap token "abcdef" deleted
3. 获取token整数的hash
- CA证书路径
/etc/kubernetes/pki/ca.crt
# 获取token_hash
# 1、查看安装日志 2、在创建token时候显示 3、使用 openssl 计算得到
[root@master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt |openssl rsa -pubin -outform der |openssl dgst -sha256 -hex
4. node安装
- 计算节点安装
- 参考 控制节点安装步骤,在计算节点上完成步骤 2,3,4,5
[root@node ~]# 参考控制节点安装步骤2
[root@node ~]# 参考控制节点安装步骤3
[root@node ~]# 参考控制节点安装步骤4
[root@node ~]# kubeadm join 192.168.1.50:6443 --token fhf6gk.bhhvsofvd672yd41 --discovery-token-ca-cert-hash sha256:ea07de5929dab8701c1bddc347155fe51c3fb6efd2ce8a4177f6dc03d5793467
#------------------------ 在 master 节点上验证---------------------------
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 76m v1.26.0
node-0001 Ready <none> 61s v1.26.0
5. 使用playbook完成批量部署
- 拷贝 kubernetes/nodejoin 到跳板机
[root@ecs-proxy s4]# cp -a kubernetes/nodejoin /root/
[root@ecs-proxy s4]# cd ~/nodejoin/
[root@ecs-proxy nodejoin]# vim nodeinit.yaml
... ...
vars:
master: '192.168.1.50:6443'
token: '这里改成你自己的token'
token_hash: 'sha256:这里改成你自己的token ca hash'
... ...
[root@ecs-proxy nodejoin]# ansible-playbook nodeinit.yaml
6. 查看集群状态
# 验证节点工作状态
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 99m v1.26.0
node-0001 Ready <none> 23m v1.26.0
node-0002 Ready <none> 57s v1.26.0
node-0003 Ready <none> 57s v1.26.0
node-0004 Ready <none> 57s v1.26.0
node-0005 Ready <none> 57s v1.26.0
# 验证容器工作状态
[root@master ~]# kubectl -n kube-system get pods
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-fc945b5f7-p4xnj 1/1 Running 0 77m
calico-node-6s8k2 1/1 Running 0 59s
calico-node-bxwdd 1/1 Running 0 59s
calico-node-d5g6x 1/1 Running 0 77m
calico-node-lfwdh 1/1 Running 0 59s
calico-node-qnhxr 1/1 Running 0 59s
calico-node-sjngw 1/1 Running 0 24m
coredns-844c6bb88b-89lzt 1/1 Running 0 59m
coredns-844c6bb88b-qpbvk 1/1 Running 0 59m
etcd-master 1/1 Running 0 70m
kube-apiserver-master 1/1 Running 0 70m
kube-controller-manager-master 1/1 Running 0 70m
kube-proxy-5xjzw 1/1 Running 0 59s
kube-proxy-9mbh5 1/1 Running 0 59s
kube-proxy-g2pmp 1/1 Running 0 99m
kube-proxy-l7lpk 1/1 Running 0 24m
kube-proxy-m6wfj 1/1 Running 0 59s
kube-proxy-vqtt8 1/1 Running 0 59s
kube-scheduler-master 1/1 Running 0 70m