Kubernets原理分解

2023-11-19

主节点(master):

在这里插入图片描述
快速介绍:

  • master也要装kubelet和kubeproxy
  • 前端访问(UI\CLI):
  • kube-apiserver:
  • scheduler:
  • controller manager:
  • etcd
  • kubelet+kubeproxy每一个节点的必备+docker(容器运行时环境)

工作节点(node):

在这里插入图片描述

快速介绍:

  • Pod:
    • docker run 启动的是一个container(容器),容器是docker的基本单位,一个应用是一个容器
    • kubelet run 启动的一个应用称为一个Pod;Pod是k8s的基本单位。
      • Pod是容器的一个再封装
      • atguigu(永远不变) ==slf4j= log4j(类)
      • 应用 ===== Pod ======= docker的容器
      • 一个容器往往代表不了一个基本应用。博客(php+mysql合起来完成)
      • 准备一个Pod 可以包含多个 container;一个Pod代表一个基本的应用。
      • IPod(看电影、听音乐、玩游戏)【一个基本产品,原子】;
      • Pod(music container、movie container)【一个基本产品,原子的】
  • Kubelet:监工,负责交互master的api-server以及当前机器的应用启停等,在master机器就是master的小助手。每一台机器真正干活的都是这个 Kubelet
  • Kube-proxy:
  • 其他:

组件交互原理:

在这里插入图片描述
想让k8s部署一个tomcat?

0、开机默认所有节点的kubelet、master节点的scheduler(调度器)、controller-manager(控制管理器)一直监听master的api-server发来的事件变化(for ::)

1、程序员使用命令行工具: kubectl ; kubectl create deploy tomcat --image=tomcat8(告诉master让集群使用tomcat8镜像,部署一个tomcat应用)

2、kubectl命令行内容发给api-server,api-server保存此次创建信息到etcd

3、etcd给api-server上报事件,说刚才有人给我里面保存一个信息。(部署Tomcat[deploy])

4、controller-manager监听到api-server的事件,是 (部署Tomcat[deploy])

5、controller-manager 处理这个 (部署Tomcat[deploy])的事件。controller-manager会生成Pod的部署信息【pod信息】

6、controller-manager 把Pod的信息交给api-server,再保存到etcd

7、etcd上报事件【pod信息】给api-server。

8、scheduler专门监听 【pod信息】 ,拿到 【pod信息】的内容,计算,看哪个节点合适部署这个Pod【pod调度过后的信息(node: node-02)】,

9、scheduler把 【pod调度过后的信息(node: node-02)】交给api-server保存给etcd

10、etcd上报事件【pod调度过后的信息(node: node-02)】,给api-server

11、其他节点的kubelet专门监听 【pod调度过后的信息(node: node-02)】 事件,集群所有节点kubelet从api-server就拿到了 【pod调度过后的信息(node: node-02)】 事件

12、每个节点的kubelet判断是否属于自己的事情;node-02的kubelet发现是他的事情

13、node-02的kubelet启动这个pod。汇报给master当前启动好的所有信息

安装:

安装方式

  • 二进制方式(建议生产环境使用)
  • MiniKube…
  • kubeadm引导方式(官方推荐)
    • GA
      大致流程:
  • 准备N台服务器,内网互通
  • 安装Docker容器化环境【k8s放弃dockershim】
  • 安装Kubernetes
    • 三台机器安装核心组件(kubeadm(创建集群的引导工具), kubeletkubectl(程序员用的命令行)
    • kubelet可以直接通过容器化的方式创建出之前的核心组件(api-server)【官方把核心组件做成镜像】
    • 由kubeadm引导创建集群

1、三台机器设置自己的hostname(不能是localhost)。云厂商注意三台机器一定要通。
三台机器依次执行k8s-01,k8s-02,k8s-03

# 修改 hostname;  k8s-01要变为自己的hostname
hostnamectl set-hostname k8s-01
# 设置 hostname 解析
echo "127.0.0.1   $(hostname)" >> /etc/hosts

2、所有机器批量执行如下脚本

#先在所有机器执行 vi k8s.sh
# 进入编辑模式(输入i),把如下脚本复制
# 所有机器给脚本权限  chmod +x k8s.sh
#执行脚本 ./k8s.sh
#/bin/sh

#######################开始设置环境##################################### \n


printf "##################正在配置所有基础环境信息################## \n"


printf "##################关闭selinux################## \n"
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
printf "##################关闭swap################## \n"
swapoff -a  
sed -ri 's/.*swap.*/#&/' /etc/fstab 

printf "##################配置路由转发################## \n"
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.d/k8s.conf

## 必须 ipv6流量桥接
echo 'net.bridge.bridge-nf-call-ip6tables = 1' >> /etc/sysctl.d/k8s.conf
## 必须 ipv4流量桥接
echo 'net.bridge.bridge-nf-call-iptables = 1' >> /etc/sysctl.d/k8s.conf
echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.d/k8s.conf
echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.d/k8s.conf
echo "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.d/k8s.conf
echo "net.ipv6.conf.all.forwarding = 1"  >> /etc/sysctl.d/k8s.conf
modprobe br_netfilter
sudo sysctl --system
	
	
printf "##################配置ipvs################## \n"
cat <<EOF | sudo tee /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules 
sh /etc/sysconfig/modules/ipvs.modules


printf "##################安装ipvsadm相关软件################## \n"
yum install -y ipset ipvsadm




printf "##################安装docker容器环境################## \n"
sudo yum remove docker*
sudo yum -y install gcc yum -y install gcc-c++
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install -y docker-ce-19.03.9  docker-ce-cli-19.03.9 containerd.io
systemctl enable docker
systemctl start docker

sudo mkdir -p /etc/docker
sudo cd /etc/docker
sudo rm -rf daemon.json
sudo tee /etc/docker/daemon.json <<-'EOF'
{
   #配置加速
  "registry-mirrors": ["https://v47ixed4.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker


printf "##################安装k8s核心包 kubeadm kubelet kubectl################## \n"
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
   http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

###指定k8s安装版本
yum install -y kubelet-1.21.0 kubeadm-1.21.0 kubectl-1.21.0

###要把kubelet立即启动。
systemctl enable kubelet
systemctl start kubelet

printf "##################下载api-server等核心镜像################## \n"
sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.21.0
kube-proxy:v1.21.0
kube-controller-manager:v1.21.0
kube-scheduler:v1.21.0
coredns:v1.8.0
etcd:3.4.13-0
pause:3.4.1
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done
## 全部完成后重新修改coredns镜像 注意1.21.0版本的k8s coredns镜像比较特殊,结合阿里云需要特殊处理,重新打标签
docker tag registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/coredns:v1.8.0 registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/coredns/coredns:v1.8.0
EOF
   
chmod +x ./images.sh && ./images.sh
   
### k8s的所有基本环境全部完成

3、使用kubeadm引导集群(参照初始化master继续做)

#### --apiserver-advertise-address 的地址一定写成自己master机器的ip地址 (私有地址)
#### 虚拟机或者其他云厂商给你的机器ip  10.96  192.168
#### 以下的只在master节点执行
## 注意:pod-cidr与service-cidr
# cidr 无类别域间路由(Classless Inter-Domain Routing、CIDR)
# 指定一个网络可达范围  pod的子网范围+service负载均衡网络的子网范围+本机ip的子网范围不能有重复域


kubeadm init \
--apiserver-advertise-address=172.31.9.67 \ 
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.21.0 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16

4、master结束以后,按照控制台引导继续往下

## 第一步
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

##第二步
export KUBECONFIG=/etc/kubernetes/admin.conf

##第三步 部署网络插件
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml



##第四步,用控制台打印的kubeadm join 去其他node节点执行 注意使用你自己生成的脚本
kubeadm join 10.170.11.8:6443 --token cnb7x2.lzgz7mfzcjutn0nk \
	--discovery-token-ca-cert-hash sha256:00c9e977ee52632098aadb515c90076603daee94a167728110ef8086d0d5b37d
	
	
kubeadm join 172.31.9.67:6443 --token jvit9r.7a122lkmm7yks0yb \
        --discovery-token-ca-cert-hash sha256:86bf986f174cb284850ea99422162ac9d556729cbcb59759110cb4c5533ebd28 



##token过期怎么办
kubeadm token create --print-join-command
kubeadm token create --ttl 0 --print-join-command
kubeadm join --token y1eyw5.ylg568kvohfdsfco --discovery-token-ca-cert-hash sha256: 6c35e4f73f72afd89bf1c8c303ee55677d2cdb1342d67bb23c852aba2efc7c73

5、验证集群

#等一会,在master节点执行
kubectl get nodes

#给节点打标签
## k8s中万物皆对象。node:机器  Pod:应用容器
###加标签  《h1》
kubectl label node k8s-02 node-role.kubernetes.io/worker=''
###去标签
kubectl label node k8s-02 node-role.kubernetes.io/worker-


## k8s集群,机器重启了会自动再加入集群,master重启了会自动再加入集群控制中心

在这里插入图片描述
6、设置kube-proxy的ipvs模式

##修改kube-proxy默认的配置 maste
kubectl edit cm kube-proxy -n kube-system
## 修改mode: "ipvs"

##改完以后重启kube-proxy
### 查到所有的kube-proxy
kubectl get pod -n kube-system |grep kube-proxy
### 删除之前的即可
kubectl delete pod 【用自己查出来的kube-proxy-dw5sf kube-proxy-hsrwp kube-proxy-vqv7n】  -n kube-system

###

在这里插入图片描述
查看重新创建的prod

kubectl get pod -n kube-system |grep kube-proxy  

在这里插入图片描述
查看启动日志输出:

kubectl logs kube-proxy-4hj9s -n  kube-system 

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kubernets原理分解 的相关文章

随机推荐

  • “千年虫”,计算机的巨大BUG!

    作者 十三侃娱乐 说起来 现在社会科技中 除了真正学过计算机专业的人 大部分人对于 千年虫 这个称号都有些陌生 甚至有些人连听都没听过 不知道的网友听到 虫 这个字可能还会脑补出一大堆不明生物的样子 但其实 千年虫 并不是一种生物 而是一种
  • LitCTF部分题目WP(Virginia,ping,SQL)

    目录 校外 Virginia ping 这是什么 SQL 注一下 校外 Virginia 维吉尼亚 想到维吉尼亚解码但没有key就爆破key Vigenere Solver guballa de key flag 发现解码出来的还有一部分是
  • 六边形地图生成(1)——基础地形

    看了大佬的六边形地图教程 跟着原教程敲了一遍代码 使用的引擎是unity 想把六边形地形的生成思路记录下来 1 基础六边形网格 基础网格很容易绘制 六个边缘点 一个中心点 如何在引擎中绘制动态网格网上一搜一大把 这里就不介绍了 2 边缘扰动
  • maya中adv插件绑定1

    一 导入模型 复制ctrl D 添加名称前缀 创建混合变形 平行选项 二 摆放adv骨骼 最好模型单独创建一个层 导入adv骨骼 1 对齐骨骼 腿部 最好是在正交视图下操作 2 对齐手臂部分 对齐到手腕即可 手指不用对 3 对齐头部 小技巧
  • Qt 实现鼠标拖动控件

    在QT项目中 窗口设置 setWindowFlags Qt FramelessWindowHint 之后 就无法拖动 所以会自定义一个menubar控件 并实现窗口拖动 效果如上图 上代码 include
  • 经典C语言程序之 C/C++:计算两个整数的和

    经典C语言程序之 C C 计算两个整数的和 在C C 编程中 计算两个整数的和是一个经典的问题 本文将介绍如何使用C语言编写一个简单的程序来实现这一功能 首先 我们需要定义两个整数变量来存储用户输入的值 并用scanf函数从用户处获取这些值
  • VSCode如何设置终端工作目录

    文章目录 前言 固定工作目录 Terminal Here 注意 前言 相信大家在使用VSCode的时候 都会有如下难受的感觉 每次打开终端的时候工作目录都是用户目录 如果要执行命令还得cd到当前文件夹 十分麻烦 为了提高工作效率 有必要设置
  • 算法------大整数

    大整数 1 大整数加法 include
  • freebsd 做文件服务器,freebsd文件服务器

    freebsd文件服务器 内容精选 换一换 FTP SFTP连接适用于从线下文件服务器或ECS服务器上迁移文件到OBS或数据库 当前仅支持Linux操作系统的FTP 服务器 连接FTP或SFTP服务器时 他们的连接参数相同 如表1所示 FT
  • <Linux开发>linux开发工具- 之-开发使用linux命令记录

    Linux开发 linux开发工具 之 开发使用linux命令记录 本文章主要记录开发过程中涉及使用的linux命令 1 查看磁盘大小分区情况 命令 df hl 可查看分区的路径 及空间大小使用情况 以及挂在点位置 2 查看指定目录文件的大
  • unity点击按钮,弹出image和Text做的弹出框

    让弹出框开始不显示 点击按钮后显示 在Hierarchy面板上新建Image 下面我命名为win 再在上面放置Image和Text组成弹出框 如下图 建立一个Message脚本 using System Collections using
  • [毕业设计]C++程序类内聚度的计算与存储

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度
  • PLSQL 基础语法

    01 PLSQL 语法 变量 if loop cursor exception 1 语法 在数据库服务器上保存的打断可执行方法 供其他开发人员调用 可以有效的减少数据库端和服务端的数据交互 提高效率 降低带宽消耗 语法格式 declare
  • 网络工程毕业设计题目100例

    文章目录 0 简介 1 如何选题 2 最新网络工程选题 2 1 Java web SSM 系统 2 2 大数据方向 2 3 人工智能方向 2 4 其他方向 4 最后 0 简介 丹成学长 搜集分享最新的网络工程专业毕设毕设选题 难度适中 适合
  • Microsemi Libero系列教程(七)——SmartDebug的使用

    SmartDebug简介 SmartDebug的使用 ActiveProbe使用
  • VMware无法创建共享文件夹

    1 Linux安装VM 1 chmod x VMware Workstation Full 14 1 3 9474260 x86 64 1 bundle 赋予执行权限 2 VMware Workstation Full 14 1 3 947
  • 二面字节被问到VARCHAR(M) 到底占用多少个字节?我跟面试官硬刚了半小时

    前言 这个问题其实很有迷惑性 问的是字节 不是字符 我们知道在计算机中只能存储二进制数据 所以要搞清楚这个问题 就要搞清楚下面2个问题 1 字节和字符的对应关系 2 varchar 到底能存多少个字节 为了搞清楚上面两个问题 又必须搞清楚m
  • jenkins中使用git遇到的坑

    error src refspec master does not match any root c32e20fd20e8 var jenkins home workspace DataPlatform git push u DataPla
  • RK3568 Android12 RK628编译报错问题

    Platform RK3568 OS Android 12 Kernel v4 19 206 SDK Version android 12 0 mid rkr1 问题 在dts中配置rk628时遇到编译报错 提示找不到rk628的label
  • Kubernets原理分解

    主节点 master 快速介绍 master也要装kubelet和kubeproxy 前端访问 UI CLI kube apiserver scheduler controller manager etcd kubelet kubeprox