容器_Docker ( 04 )

news2024/11/20 18:38:23

容器_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
  • 安装部署方式 (两种)
    1. 源码部署 : 下载源码或编译好的二进制 , 手工添加参数启动服务 , kubernetes采用证书认证方式 , 需要创建大量整数
    2. 容器部署 : 官方把服务做成"镜像" , 下载镜像 , 启动即可
  • 官方工具kuberadm采用的方式
部署概述
  1. 内核版本 >= 3.10
  2. 最低配置 2cpu , 2G内存
  3. 节点之中不可以有重复的主机名 , MAC地址或product_uuid
  4. 卸载防火墙
  5. 禁用 swap
主机清单
主机名IP地址最低配置
master192.168.1.502CPU,4G内存
node-0001192.168.1.512CPU,4G内存
node-0002192.168.1.522CPU,4G内存
node-0003192.168.1.532CPU,4G内存
node-0004192.168.1.542CPU,4G内存
node-0005192.168.1.552CPU,4G内存
harbor192.168.1.302CPU,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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1466119.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kotlin filterIsInstance filterNotNull forEach

Kotlin filterIsInstance filterNotNull forEach fun main(args: Array<String>) {val i1 MyItem(1, 1)val i2: MyItem? nullval i3: Int 3val i4 "4"val i5 nullval i6 MyItem(6, 6)val list mutableListOf<Any?>(i1, i2, i3, i4, i5, i6)lis…

蓝牙耳机哪个品牌质量好?2024超高性能机型比拼推荐

​无线耳机已经成为现代生活中的必备数码产品&#xff0c;尤其在感受到无线带来的自由后&#xff0c;很难再适应有线耳机的束缚。因此&#xff0c;耳机市场竞争激烈&#xff0c;各种类型和外观的耳机层出不穷。在此&#xff0c;我为大家总结了五款使用体验很不错的蓝牙耳机&…

静态时序分析:SDC约束命令set_driving_cell详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在上文中&#xff0c;我们不建议使用set_drive命令而是使用set_driving_cell命令&#xff0c;这是一个描述输入端口驱动能力更精确的方法。因为大多数情况下&…

黑马头条-day10

文章目录 app端文章搜索1、文章搜索1.1 ElasticSearch环境搭建1.2 索引库创建①需求分析②ES导入数据场景分析③创建索引和映射 1.3 索引数据同步①app文章历史数据导入ES②文章实时数据导入ES 1.4 文章搜索多条件复合查询①关键词搜索②搜索接口定义 2、搜索历史记录2.1 需求说…

免费的代理IP能用吗?

随着大家对代理IP的认知逐步加深&#xff0c;不可避免地&#xff0c;免费代理IP安全性和潜在风险也越来越关注&#xff0c;今天我们就来一探究竟&#xff0c;这到底是怎么一回事。 首先&#xff0c;我们得了解一下代理IP。 代理IP是指作为中介的服务器&#xff0c;它能够代理用…

java.lang.IllegalStateException: Promise already completed.

spark submit 提交作业的时候提示Promise already complete 完整日志如下 File "/data5/hadoop/yarn/local/usercache/processuser/appcache/application_1706192609294_136972/container_e41_1706192609294_136972_02_000001/py4j-0.10.6-src.zip/py4j/protocol.py"…

修改单据转换规则后保存报错提示

文章目录 修改单据转换规则后保存报错提示 修改单据转换规则后保存报错提示

软考系分之多媒体分类、声音、图像

文章目录 1、概要2、 媒体分类3、声音4、图像5、总结 1、概要 本篇重点介绍多媒体技术&#xff0c;包括多媒体分类、声音、图像。 2、 媒体分类 媒体主要分为5类&#xff0c;感觉媒体、表现媒体、表示媒体、传输媒体和存储媒体。感觉媒体&#xff0c;就是直接作用于人感官的媒…

android input命令支持多指触摸成果展示-千里马framework实战开发

hi input命令扩展提示部分 generic_x86_64:/ # input -h Error: Unknown command: -h Usage: input [<source>] <command> [<arg>...]The source…

体验LobeChat搭建私人聊天应用

LobeChat是什么 LobeChat 是开源的高性能聊天机器人框架&#xff0c;支持语音合成、多模态、可扩展的&#xff08;Function Call&#xff09;插件系统。支持一键免费部署私人 ChatGPT/LLM 网页应用程序。 地址&#xff1a;https://github.com/lobehub/lobe-chat 为什么要用Lobe…

如何快速导出vercel project中的环境变量

我在vercel中集成了某些插件或者链接了数据库&#xff0c;要如何快速的导出这些环境变量呢&#xff1f; 具体方法如下&#xff1a; npm i -g vercelvercel linkvercel env pull .env.local首先是安装vercel然后登录vercel 最后拉取环境变量到.env.local

2.22学习总结

1.营救 2.租用游艇 3.砍树 4.买礼物 5.刷题统计 砍树https://www.dotcpp.com/oj/problem3157.html 题目描述 给定一棵由 n 个结点组成的树以及 m 个不重复的无序数对 (a1, b1), (a2, b2), . . . , (am, bm)&#xff0c;其中 ai 互不相同&#xff0c;bi 互不相同&#xff0c;ai…

Ansible 简介及部署 基础模块学习 ansible部署rsync 及时监控远程同步

Ansible介绍&#xff1a; Ansible 是一个配置管理系统&#xff0c;当下最流行的批量自动化运维工具之一&#xff0c;它是一款开源的自动化工具&#xff0c;基于Python开发的配置管理和应用部署的工具。 Ansible 是基于模块工作的&#xff0c;它只是提供了一种运行框架&#xff…

Spring之AOP源码解析(上)

Aop相关注解 EnableTransactionManagementEnableAspectJAutoProxyEnableAsync... 从注解切入来看看这些注解都干了什么 Import注解作用简述 注入的类一般继承ImportSelector或者ImportBeanDefinitionRegistrar接口 继承ImportSelector接口&#xff1a;selectImports方法返回…

后端经典面试题合集

目录 1. Java基础1-1. JDK 和 JRE 和 JVM 分别是什么&#xff0c;有什么区别&#xff1f;1-2. 什么是字节码&#xff1f;采用字节码的最大好处是什么&#xff1f; 1. Java基础 1-1. JDK 和 JRE 和 JVM 分别是什么&#xff0c;有什么区别&#xff1f; JDK 是Java开发工具包&am…

lora网关智慧工厂三色灯安灯状态采集钡铼技术S281

LoRa网关结合钡铼技术S281模块在智慧工厂三色灯安灯状态采集方面具有广泛的应用前景。智慧工厂的安全生产管理对于企业生产经营至关重要&#xff0c;而三色灯安灯是工厂安全生产管理的重要指示灯&#xff0c;通过LoRa无线通信技术和钡铼技术S281模块&#xff0c;可以实现对三色…

网络安全-nc(Netcat)工具详解

经常在反弹shell的时候使用nc命令&#xff0c;但是从来没有了解过&#xff0c;今天翻书看到了&#xff0c;准备记录一下。 nc全称Netcat&#xff0c;是TCP/IP连接的瑞士军刀。哈哈我最喜欢瑞士军刀了。 有一个比较偏的知识点&#xff0c;nc还可以探测目标的端口是否开放&…

【springBoot】springAOP

AOP的概述 AOP是面向切面编程。切面就是指某一类特定的问题&#xff0c;所以AOP也可以理解为面向特定方法编程。AOP是一种思想&#xff0c;拦截器&#xff0c;统一数据返回和统一异常处理是AOP思想的一种实现。简单来说&#xff1a;AOP是一种思想&#xff0c;对某一类事务的集…

B端系统:工作台页面,如何从平庸走向出众

Hi&#xff0c;大家好&#xff0c;我是贝格前端工场&#xff0c;从事8年前端开发的老司机。大家看过很多平庸的工作台页面&#xff0c;但是仔细分析过平庸的表现吗&#xff0c;仔细思考过如何实现出众的效果吗&#xff1f;这篇文章为你解读。 一、工作台页面是什么&#xff0c;…

深信服技术认证“SCCA-C”划重点:深信服超融合HCI

为帮助大家更加系统化地学习云计算知识&#xff0c;高效通过云计算工程师认证&#xff0c;深信服特推出“SCCA-C认证备考秘笈”&#xff0c;共十期内容。“考试重点”内容框架&#xff0c;帮助大家快速get重点知识 划重点来啦 *点击图片放大展示 深信服云计算认证&#xff08;S…