云原生|kubernetes篇kubernetes原理与安装(代码片段)

Lansonli Lansonli     2023-03-11     306

关键词:

https://bbs.csdn.net/forums/lansonhttps://bbs.csdn.net/forums/lanson

文章目录

Kubernetes原理与安装

一、集群原理

1、master-node 架构

2、工作原理

3、原理分解

二、组件交互原理

三、安装

1、理解

2、执行


Kubernetes原理与安装

一、集群原理

1、master-node 架构

master 和 worker怎么交互

master决定worker里面都有什么

worker只是和master (API) 通信; 每一个节点自己干自己的活  

程序员使用UI或者CLI操作k8s集群的master,就可以知道整个集群的状况

2、工作原理

master节点(Control Plane【控制面板】):master节点控制整个集群

master节点上有一些核心组件:

  • Controller Manager:控制管理器

  • etcd:键值数据库(redis)【记账本,记事本】

  • scheduler:调度器

  • api server:api网关(所有的控制都需要通过api-server)

node节点(worker工作节点):

  • kubelet(监工):每一个node节点上必须安装的组件。

  • kube-proxy:代理。代理网络

部署一个应用?

程序员:调用CLI告诉master,我们现在要部署一个tomcat应用

  • 程序员的所有调用都先去master节点的网关api-server。这是matser的唯一入口(mvc模式中的c层)

  • 收到的请求先交给master的api-server。由api-server交给controller-mannager进行控制

  • controller-mannager 进行 应用部署

  • controller-mannager 会生成一次部署信息

  • 部署信息被记录在etcd中

  • scheduler调度器从etcd数据库中,拿到要部署的应用,开始调度。看哪个节点合适,

  • scheduler把算出来的调度信息再放到etcd中

  • 每一个node节点的监控kubelet,随时和master保持联系的(给api-server发送请求不断获取最新数据),所有节点的kubelet就会从master

  • 假设node2的kubelet最终收到了命令,要部署。

  • kubelet就自己run一个应用在当前机器上,随时给master汇报当前应用的状态信息,分配IP

  • node和master是通过master的api-server联系的

  • 每一个机器上的kube-proxy能知道集群的所有网络。只要node访问别人或者别人访问node,node上的kube-proxy网络代理自动计算进行流量转发

下图和上图一样的,再理解一下

无论访问哪个机器,都可以访问到真正应用(Service【服务】)

3、原理分解

3.1、主节点(master)

快速介绍:

  • master也要装kubelet和kubeproxy

  • 前端访问(UI\\CLI):

  • kube-apiserver:

  • scheduler:

  • controller manager:

  • etcd

  • kubelet+kubeproxy每一个节点的必备+docker(容器运行时环境)

3.2、工作节点(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发来的事件变化

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当前启动好的所有信息  

三、安装

1、理解

安装方式

  • 二进制方式(建议生产环境使用)

  • kubeadm引导方式(官方推荐)

大致流程

  • 准备N台服务器,内网互通

  • 安装Docker容器化环境【k8s放弃dockershim】

  • 安装Kubernetes

    • 三台机器安装核心组件(kubeadm(创建集群的引导工具), kubeletkubectl(程序员用的命令行)

    • kubelet可以直接通过容器化的方式创建出之前的核心组件(api-server)【官方把核心组件做成镜像】

    • 由kubeadm引导创建集群

2、执行

2.1、准备机器

  • 开通三台机器,内网互通,配置公网ip。centos7.8/7.9,基础实验2c4g三台也可以

  • 每台机器的hostname不要用localhost,可用k8s-01,k8s-02,k8s-03之类的【不包含下划线、小数点、大写字母】(这个后续步骤也可以做)

2.2、安装前置环境(都执行)

2.2.1、基础环境

#关闭防火墙: 如果是云服务器,需要设置安全组策略放行端口
# https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#check-required-ports
systemctl stop firewalld
systemctl disable firewalld

# 修改 hostname
hostnamectl set-hostname k8s-01
# 查看修改结果
hostnamectl status
# 设置 hostname 解析
echo "127.0.0.1   $(hostname)" >> /etc/hosts

#关闭 selinux: 
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0

#关闭 swap:
swapoff -a  
sed -ri 's/.*swap.*/#&/' /etc/fstab 

#允许 iptables 检查桥接流量
#https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#%E5%85%81%E8%AE%B8-iptables-%E6%A3%80%E6%9F%A5%E6%A1%A5%E6%8E%A5%E6%B5%81%E9%87%8F
## 开启br_netfilter
## sudo modprobe br_netfilter
## 确认下
## lsmod | grep br_netfilter

## 修改配置


#####这里用这个,不要用课堂上的配置。。。。。。。。。
#将桥接的 IPv4 流量传递到 iptables 的链:
# 修改 /etc/sysctl.conf
# 如果有配置,则修改
sed -i "s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g"  /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g"  /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g"  /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.all.disable_ipv6.*#net.ipv6.conf.all.disable_ipv6=1#g"  /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.default.disable_ipv6.*#net.ipv6.conf.default.disable_ipv6=1#g"  /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.lo.disable_ipv6.*#net.ipv6.conf.lo.disable_ipv6=1#g"  /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.all.forwarding.*#net.ipv6.conf.all.forwarding=1#g"  /etc/sysctl.conf
# 可能没有,追加
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding = 1"  >> /etc/sysctl.conf
# 执行命令以应用
sysctl -p

2.2.2、docker环境

sudo yum remove docker*
sudo yum install -y yum-utils
#配置docker yum 源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装docker 19.03.9
yum install -y docker-ce-3:19.03.9-3.el7.x86_64  docker-ce-cli-3:19.03.9-3.el7.x86_64 containerd.io

#安装docker 19.03.9   docker-ce  19.03.9
yum install -y docker-ce-19.03.9-3  docker-ce-cli-19.03.9 containerd.io

#启动服务
systemctl start docker
systemctl enable docker

#配置加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'

  "registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"]

EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

2.3、安装k8s核心(都执行)

# 配置K8S的yum源
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

# 卸载旧版本
yum remove -y kubelet kubeadm kubectl

# 查看可以安装的版本
yum list kubelet --showduplicates | sort -r

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

# 开机启动kubelet
systemctl enable kubelet && systemctl start kubelet

2.4、初始化master节点(master执行)

############下载核心镜像 kubeadm config images list:查看需要哪些镜像###########

####封装成images.sh文件
#!/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/lansonli_k8s_images/$imageName
done
#####封装结束

chmod +x images.sh && ./images.sh


# registry.cn-hangzhou.aliyuncs.com/lansonli_k8s_images/coredns:v1.8.0

##注意1.21.0版本的k8s coredns镜像比较特殊,结合阿里云需要特殊处理,重新打标签
docker tag registry.cn-hangzhou.aliyuncs.com/lansonli_k8s_images/coredns:v1.8.0 registry.cn-hangzhou.aliyuncs.com/lansonli_k8s_images/coredns/coredns:v1.8.0

########kubeadm init 一个master########################
########kubeadm join 其他worker########################
kubeadm init \\
--apiserver-advertise-address=10.170.11.8 \\
--image-repository registry.cn-hangzhou.aliyuncs.com/lansonli_k8s_images \\
--kubernetes-version v1.21.0 \\
--service-cidr=10.96.0.0/16 \\
--pod-network-cidr=192.168.0.0/16
## 注意:pod-cidr与service-cidr
# cidr 无类别域间路由(Classless Inter-Domain Routing、CIDR)
# 指定一个网络可达范围  pod的子网范围+service负载均衡网络的子网范围+本机ip的子网范围不能有重复域



######按照提示继续######
## init完成后第一步:复制相关文件夹
To start using your cluster, you need to run the following as a regular user:

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

## 导出环境变量
Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf


### 部署一个pod网络
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/
  ##############如下:安装calico#####################
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml


### 命令检查
kubectl get pod -A  ##获取集群中所有部署好的应用Pod
kubectl get nodes  ##查看集群所有机器的状态
 

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 172.24.80.222:6443 --token nz9azl.9bl27pyr4exy2wz4 \\
	--discovery-token-ca-cert-hash sha256:4bdc81a83b80f6bdd30bb56225f9013006a45ed423f131ac256ffe16bae73a20 

2.5、初始化worker节点(worker执行)

## 用master生成的命令即可

kubeadm join 172.24.80.222:6443 --token nz9azl.9bl27pyr4exy2wz4 \\
	--discovery-token-ca-cert-hash sha256:4bdc81a83b80f6bdd30bb56225f9013006a45ed423f131ac256ffe16bae73a20 
	
	

##过期怎么办
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

2.6、验证集群

#获取所有节点
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重启了会自动再加入集群控制中心

2.7、设置ipvs模式

k8s整个集群为了访问通;默认是用iptables,性能下(kube-proxy在集群之间同步iptables的内容)

#1、查看默认kube-proxy 使用的模式
kubectl logs -n kube-system kube-proxy-28xv4
#2、需要修改 kube-proxy 的配置文件,修改mode 为ipvs。默认iptables,但是集群大了以后就很慢
kubectl edit cm kube-proxy -n kube-system
修改如下
   ipvs:
      excludeCIDRs: null
      minSyncPeriod: 0s
      scheduler: ""
      strictARP: false
      syncPeriod: 30s
    kind: KubeProxyConfiguration
    metricsBindAddress: 127.0.0.1:10249
    mode: "ipvs"
###修改了kube-proxy的配置,为了让重新生效,需要杀掉以前的Kube-proxy
kubectl get pod -A|grep kube-proxy
kubectl delete pod kube-proxy-pqgnt -n kube-system
### 修改完成后可以重启kube-proxy以生效

  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨

云原生|kubernetes篇深入kubernetes(k8s)概念(代码片段)

文章目录深入Kubernetes(k8s)概念一、基础概念理解二、kubernetesObjects(k8s对象)1、什么是k8s对象2、描述k8s对象3、k8s对象yaml的结构4、管理k8s对象5、对象名称6、名称空间7、标签和选择器8、注解annotation9、字段选... 查看详情

云原生|kubernetes篇ingress案例实战(代码片段)

文章目录Ingress案例实战一、基本配置二、默认后端三、路径重写四、配置SSL五、限速六、灰度发布-Canary七、会话保持-Session亲和性Ingress案例实战一、基本配置apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:itlanson-ingressnamespace:defaults... 查看详情

云原生|kubernetes篇深入了解ingress(代码片段)

文章目录深入了解Ingress一、Ingressnginx和nginxingress1、nginxingress2、ingressnginx二、ingressnginx安装1、安装2、验证3、卸载深入了解Ingress为什么需要Ingress?Service可以使用NodePort暴露集群外访问端口,但是性能低下不安全缺少Layer7... 查看详情

云原生|kubernetes篇kubernetes原理与安装(代码片段)

...://bbs.csdn.net/forums/lansonhttps://bbs.csdn.net/forums/lanson文章目录Kubernetes原理与安装一、集群原理1、master-node架构2、工作原理3、原理分解二、组件交互原理三、安装1、理解2、执行Kubernetes原理与安装一、集群原理1、master-node架构master和... 查看详情

kubernetes第零篇:认识kubernetes

文章目录一、前言二、kubernetes和云原生三、从DockerSwarm到Kubernetes四、kubernetes组件和架构简介4.1kubernetes组件4.1.1Container4.1.2Pod4.1.3ReplicaSet4.1.4Deployment4.1.5Label与Selector4.1.6Service4.1.7Node4.1.8多Node节点组成的集群4.2kuber 查看详情

云原生|kubernetes篇深入rcrsdaemonsetstatefulset(代码片段)

...的Pod来替代;而如果异常多出来的容器也会自动回收Kubernetes官方建议使用RS(ReplicaSet)替代RC(ReplicationController)进行部署,RS跟RC没有本质的不同,只是名字不一样,并且RS支持集合式的selector RC... 查看详情

云原生kubernetes入门详细讲解

目录1、Kubernetes是什么2、Kubernetes不是什么3、Kubernetes架构与分层4、Kubernetes集群架构5、Kubernetes集群组件5.1、K8s在Master上的组件5.2、K8s在Node上的组件6、KubernetesAPI    在云原生技术与生态快速发展的今天,越来越多的IT厂商... 查看详情

kubernetes使用vsphere存储

前一篇介绍Kubernetes集群使用vSphere云原生卷的集群是通过kubeadm构建的,这篇介绍如何通过Rancher自定义集群构建。预置要求完成Rancher2.x部署完成vSphere上Kubernetes虚拟机准备完成上篇Kubernetes使用vSphere存储-vSphere-CSI-longtds-博客园(cnblo... 查看详情

云原生kubernetes系列第三篇二进制部署单节点kubernetes(k8s)v1.20(不要因为别人都在交卷,自己就乱写答案)(代码片段)

...建用于生成CA证书、相关组件的证书和私钥的目录5.3上传kubernetes压缩包5.4创建认证文件5.5开启apiserver服务5.6启动scheduler服务5.7启动controller-manager服务5.8其他六、部署WorkerNode组件七、部署网络组件八、部署CoreDNS九、部署Dashboard总... 查看详情

kubernetes和云原生

1.云原生相关1.1.什么是云原生CloudNative最早是在2013年由Pivotal公司的MattStine提出的。2015年CNCF(CloudNativeComputingFoudation,云原生计算基金会)成立。官方发布的云原生v1.0定义是:“云原生技术有利于各组织在公有云、私有云和混合... 查看详情

云原生之kubernetes实战kubernetes集群的检测工具——popeye

【云原生之kubernetes实战】kubernetes集群的检测工具——popeye一、popeye介绍1.popeye简介2.Popeye特点二、检查本地k8s集群状态三、安装popeye工具1.下载Popeye2.解压压缩包3.复制文件4.检查版本四、查看popeye帮助五、扫描本地kubernetes集群六... 查看详情

大话云原生负载均衡篇-小饭馆客流量变大了

...《大话云原生》系列的第二篇,第一篇《煮饺子与docker、kubernetes之间的关系》推出之后受到大家的欢迎,很多朋友联系到我给我加油打气,感谢!我会继续写下去!书接上回介绍了《煮饺子与docker、kubernetes之间的关系》之后,... 查看详情

云原生|kubernetes篇深入了解deployment(代码片段)

文章目录深入了解Deployment一、什么是Deployment二、Deployment创建三、Deployment更新机制1、比例缩放(ProportionalScaling)2、HPA(动态扩缩容)3、Canary(金丝雀部署)4、Deployment状态与排错深入了解Deployment一、什... 查看详情

云原生之kubernetes实战在kubernetes集群下部署rainbond平台

【云原生之kubernetes实战】在kubernetes集群下部署Rainbond平台一、Rainbond介绍1.Rainbond简介2.Rainbond特点二、检查本地kubernetes集群状态1.检查工作节点状态2.检查系统pod状态三、安装nfs共享存储1.安装nfs2.配置共享目录3.使配置生效4.设置... 查看详情

云原生之kubernetes实战使用yum方式部署kubernetes集群

【云原生之kubernetes实战】使用yum方式部署kubernetes集群一、环境规划1.节点IP规划2.本次k8s部署介绍二、环境检查1.检查docker状态2.检查节点系统版本3.检查防火墙状态三、安装前环境配置工作1.关闭swap2.开启内核对流量转发3.关闭sel... 查看详情

云原生之kubernetes实战kubernetes集群的hpa弹性伸缩

【云原生之kubernetes实战】kubernetes集群的HPA弹性伸缩一、HAP介绍1.HPA简介2.HPA的实现原理3.HPA自动伸缩示意图4.HPA中影响Pod数量的因素5.HPA改善服务的方式二、检查本地k8s环境1.检查k8s版本2.检查k8s节点状态3.检查系统pod状态三、安装... 查看详情

《云原生人才计划之kubernetes技术图谱》发布!

简介:如今越来越多的公司正在拥抱Kubernetes,当前Kubernetes已经主导了云业务流程。那么称霸容器领域的Kubernetes究竟有什么魔力呢?又该从何学起呢?这需要对Kubernetes的学习有一个清晰的学习路径,从而有效... 查看详情

云原生之kubernetes实战kubernetes集群的证书管理

【云原生之kubernetes实战】kubernetes集群的证书管理一、kubernetes证书的分类二、检查k8s集群状态三、检查相关证书过期时间1.查看sealos部署的k8s集群证书过期时间2.查看kubeadm部署的k8s集群过期时间3.证书有效期分析四、备份相关证... 查看详情