往期回顾:
云端技术驾驭DAY01——云计算底层技术奥秘、云服务器磁盘技术、虚拟化管理、公有云概述
云端技术驾驭DAY02——华为云管理、云主机管理、跳板机配置、制作私有镜像模板
云端技术驾驭DAY03——云主机网站部署、web集群部署、Elasticsearch安装
云端技术驾驭DAY04——Logstash安装部署及插件模块
云端技术驾驭DAY06——容器技术概述、镜像与容器管理、定制简单镜像、容器内安装部署服务
云端技术驾驭DAY07——Dockerfile详解、容器镜像制作、私有仓库
云端技术驾驭DAY08——部署容器服务、Compose微服务管理、harbor仓库部署及管理
解密云原生
集群概述
Kubernetes概述
- Kubernetes起源
– 就在Docker容器技术被炒得热火朝天之时,人们发现如果想要将Docker应用于具体的业务实现,是存在困难的——编排、管理和调度等各个方面。于是人们迫切需要一套管理系统,对Docker及容器进行更高级更灵活的管理,就在这个时候,Kuberneres出现了
– Kubernetes简称k8s - k8s是做什么的?
– k8s的创造者是Google
– k8s并不是全新的发明,他是Google十多年大规模容器管理技术Borg的开源版本
– k8s是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、自动维护等功能
k8s集群架构
- 核心架构
– master(管理节点)
– node(计算节点)
– image(镜像仓库)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d655427429c019d2d66d105326fa1967.png)
角色与功能
- Master功能
– 提供集群的控制
– 对集群进行全局决策
– 检测和响应集群事件 - Master节点核心组件
– API Server
– Scheduler
– ControllerManager
– etcd - Node功能
– 运行容器的实际节点
– 提供运行环境
– 在多个节点上运行
– 水平扩展 - Node核心组建
– Kubelet
– kube-proxy
– Runtime - 镜像仓库
– 存储镜像
– 为节点提供镜像支持 - 仓库组件
– Registry或Harbor
安装部署控制节点
安装控制节点
部署概述
- 官网:链接: kubernetes.io
- 安装部署方式
– 源码部署
– 容器部署(推荐) - 部署环境要求
– 内核版本 >= 3.10
– 最低配置 2CPU,2G内存
– 禁用firewalld
– 禁用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(于DAY08已部署完成) | 192.168.1.30 | 2CPU,4G内存 |
[root@harbor ~]# docker compose -p harbor ps
控制节点安装
- 配置软件仓库(下载docker和k8s相关组件)
[root@ecs-proxy ~]# rsync -av docker/ /var/localrepo/docker/
[root@ecs-proxy ~]# rsync -av kubernetes/packages/ /var/localrepo/k8s/
[root@ecs-proxy ~]# createrepo --update /var/localrepo/
- 系统环境配置
[root@master ~]# sed '/swap/d' -i /etc/fstab
[root@master ~]# swapoff -a
[root@master ~]# dnf -y remove firewalld-*
[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 -y install \
> kubeadm \ // 集群配置工具
> kubelet \ // 管理pod,在集群中的每个节点上启动
> kubectl \ // 用来与集群通信的命令行工具
> containerd.io \ // 容器管理软件
> ipvsadm \ // 集群管理工具
> ipset \ // 管理IP集
> iproute-tc // 网络流量管理工具
[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
154 [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] // 插入以下行
155 endpoint = ["https://harbor:443"]
156 [plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor:443"]
157 endpoint = ["https://harbor:443"]
158 [plugins."io.containerd.grpc.v1.cri".registry.configs."harbor:443".tls]
159 insecure_skip_verify = true
[root@master ~]# systemctl enable kubelet containerd --now
- 配置内核参数
[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
导入k8s镜像
- 如何获取镜像?
– 使用kubeadm管理工具可以查询镜像信息kubeadm config images list
,然后docker pull
下载
– 在可以访问官方镜像仓库的机器上使用docker pull
下载
- 导入镜像
[root@ecs-proxy ~]# rsync -av kubernetes/init 192.168.1.50:
[root@master ~]# dnf -y install docker-ce
[root@master ~]# mkdir /etc/docker
[root@master ~]# vim /etc/docker/daemon.json
{
"registry-mirrors":["https://harbor:443"],
"insecure-registries":["harbor:443"]
}
[root@master ~]# systemctl enable docker --now
[root@master ~]# docker login harbor:443
Username: admin
Password: admin123
Login Succeeded
[root@master ~]# docker load -i init/v1.26.0.tar.xz
[root@master ~]# docker images|while read i t _;do // 将本地镜像推送到Harbor仓库,并删除本地的镜像
> [[ "${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
初始化主控节点
- 设置kube命令的Tab键补全
[root@master ~]# source <(kubeadm completion bash|tee /etc/bash_completion.d/kubeadm)
[root@master ~]# source <(kubectl completion bash|tee /etc/bash_completion.d/kubectl)
- 测试系统环境
[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
- master安装
[root@master ~]# kubeadm init --config=init/init.yaml | tee init/init.log // 主控节点初始化
[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 81s v1.26.0
calico插件
calico概述
- calico是什么
– 在虚拟化平台中,比如OpenStack、Docker等都需要实现workloads之间互联,但同时也需要对容器做隔离控制,设置访问策略,calico就可以解决以上问题
– calico可以让不同节点上的容器实现互联互通,同时也可以设置访问策略,它是一种容器之间网络互通的解决方案 - calico优势
– 更节约资源:calico使用的三层路由方法,抑制二层广播,减少了资源开销,并且具有可扩展性
– 更容易管理:因为没有隧道,意味着workloads之间路径更短更简单,配置更少,更容易管理
– 更少的依赖:calico仅依赖三层路由可达
– 适配性广:较少的依赖性使它能适配所有VM、Container、白盒或者混合环境场景
calico安装
[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
[root@master calico]# sed -ri 's,^(\s*image: )(.*/)?(.+),\1harbor:443/plugins/\3,' calico.yaml // 修改配置文件中镜像地址
[root@master calico]# kubectl apply -f calico.yaml
[root@master calico]# kubectl get nodes // 等待一分钟,状态变为Ready即成功
NAME STATUS ROLES AGE VERSION
master Ready control-plane 26m v1.26.0
kubeadm工具
命令 | 解释 |
---|
help | 帮助信息 |
version | 版本信息 |
config | 镜像管理命令 |
init | 集群初始化命令 |
reset | 还原、删除集群配置 |
join | 计算节点加入集群 |
token | token凭证管理 |
[root@master ~]# kubeadm config print init-defaults > init.yaml // 创建模板文件
[root@master ~]# vim init.yaml // 配置文件内容解释
12 advertiseAddress: 1.2.3.4 // 管理节点的IP地址
15 criSocket: unix:///var/run/containerd/containerd.sock // socket地址
17 name: node // 主机名称
30 imageRepository: registry.k8s.io // 私有仓库地址
32 kubernetesVersion: 1.26.0 // 版本信息,镜像标签
35 podSubnet: 10.244.0.0/16 // 新添加,POD地址段
36 serviceSubnet: 10.96.0.0/12 // Service的地址段
--------------
// 在文件最后追加以下行,使用IPVS模式
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
ipvs:
strictARP: true
--------------
// 在文件最后追加以下行,使用Cgroup驱动模式
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: "systemd"
安装部署计算节点
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为无限
[root@master ~]# kubeadm token list // 查看token
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
abcdef.0123456789abcdef 22h 2024-02-22T06:07:14Z authentication,signing <none> system:bootstrappers:kubeadm:default-node-token
[root@master ~]# kubeadm token delete abcdef.0123456789abcdef // 删除token
bootstrap token "abcdef" deleted
[root@master ~]# kubeadm token create --ttl=0 --print-join-command // 创建token
kubeadm join 192.168.1.50:6443 --token gecjk9.1s2jkvi7nslqvr3k --discovery-token-ca-cert-hash sha256:f73d7f97da01c89856f42dfdb421554e0eb75b5dafe8a57dfa2c4edd8defbc51
- 如何获取token证书的hash
– 方式一:安装日志
– 方式二:创建token时显示
– 方式三:找到CA证书路径/etc/kubernetes/pki/ca.crt
,通过openssl指令获取
[root@master pki]# openssl x509 -pubkey -in ca.crt | \
> openssl rsa -pubin -outform der | \
> openssl dgst -sha256 -hex
writing RSA key
(stdin)= f73d7f97da01c89856f42dfdb421554e0eb75b5dafe8a57dfa2c4edd8defbc51
node安装
- 在每台node主机上,完成“安装控制节点”的“2”,“3”,“4”步骤,这里用playbook的方式完成
[root@ecs-proxy ~]# mkdir kubernetes/nodejoin/ // 创建ansible工作目录
[root@ecs-proxy ~]# cd kubernetes/nodejoin/
[root@ecs-proxy nodejoin]# vim ansible.cfg // 创建ansible配置文件
[defaults]
inventory = hostlist
host_key_checking = False
[root@ecs-proxy nodejoin]# vim hostlist // 创建主机清单文件
[nodes]
192.168.1.[51:55]
[root@ecs-proxy nodejoin]# vim nodeinit.yaml // 编写playbook
- name: node join k8s cluster
hosts: nodes
vars:
master: "192.168.1.50:6443"
token: "###这里改成你自己的token###"
token_hash: "sha256:###这里改成你自己的token ca hash###"
tasks:
- name: disable swap from fstab file
lineinfile:
path: /etc/fstab
state: absent
regexp: 'swap'
- name: remove firewalld packages
dnf:
name: "firewalld-*"
state: absent
- name: install k8s node packages
dnf:
name: kubeadm,kubelet,kubectl,containerd.io,ipvsadm,ipset,iproute-tc
state: latest
update_cache: yes
- name: update modify config.toml
template:
src: config.j2 // 这个文件可以从master主机复制出来
dest: /etc/containerd/config.toml
owner: root
group: root
mode: '0644'
- name: create containerd.conf
copy:
dest: /etc/modules-load.d/containerd.conf
owner: root
group: root
mode: '0644'
content: |
overlay
br_netfilter
xt_conntrack
- name: create 99-kubernetes-cri.conf
copy:
dest: /etc/sysctl.d/99-kubernetes-cri.conf
owner: root
group: root
mode: '0644'
content: |
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
- name: set /etc/hosts
copy:
dest: /etc/hosts
owner: root
group: root
mode: '0644'
content: |
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.1.30 harbor
192.168.1.50 master
{% for i in groups.nodes %}
{{ hostvars[i].ansible_eth0.ipv4.address }} {{ hostvars[i].ansible_hostname }}
{% endfor %}
- name: enable k8s kubelet,runtime service
service:
name: "{{ item }}"
state: started
enabled: yes
loop:
- systemd-modules-load
- containerd
- kubelet
- name: check node state
stat:
path: /etc/kubernetes/kubelet.conf
register: result
- name: node join cluster
shell: |
swapoff -a
sysctl -p /etc/sysctl.d/99-kubernetes-cri.conf
kubeadm join {{ master }} --token {{ token }} --discovery-token-ca-cert-hash {{ token_hash }}
args:
executable: /bin/bash
when: result.stat.exists == False
[root@ecs-proxy nodejoin]# ansible-playbook nodeinit.yaml
[root@master pki]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 114m v1.26.0
node-0001 Ready <none> 2m49s v1.26.0
node-0002 Ready <none> 2m49s v1.26.0
node-0003 Ready <none> 2m49s v1.26.0
node-0004 Ready <none> 2m49s v1.26.0
node-0005 Ready <none> 2m49s v1.26.0
[root@master pki]# kubectl -n kube-system get pods
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-fc945b5f7-kv9gc 1/1 Running 0 91m
calico-node-2wz65 1/1 Running 0 5m10s
calico-node-6jp85 1/1 Running 0 5m10s
calico-node-d7kqk 1/1 Running 0 5m10s
calico-node-f9h7r 1/1 Running 0 5m10s
calico-node-nskdx 1/1 Running 0 5m10s
calico-node-s4mn4 1/1 Running 0 91m
coredns-844c6bb88b-v45wq 1/1 Running 0 116m
coredns-844c6bb88b-xnkcg 1/1 Running 0 116m
etcd-master 1/1 Running 0 116m
kube-apiserver-master 1/1 Running 0 116m
kube-controller-manager-master 1/1 Running 0 116m
kube-proxy-7p67m 1/1 Running 0 116m
kube-proxy-cf96z 1/1 Running 0 5m10s
kube-proxy-cqkg6 1/1 Running 0 5m10s
kube-proxy-gp5z6 1/1 Running 0 5m10s
kube-proxy-t2c8p 1/1 Running 0 5m10s
kube-proxy-xp5vf 1/1 Running 0 5m10s
kube-scheduler-master 1/1 Running 0 116m