写点什么

云原生(十一) | Kubernetes 篇之 Kubernetes 原理与安装

作者:Lansonli
  • 2022 年 7 月 23 日
  • 本文字数:5907 字

    阅读完需:约 19 分钟

云原生(十一) | Kubernetes篇之Kubernetes原理与安装

​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-portssystemctl stop firewalldsystemctl disable firewalld
# 修改 hostnamehostnamectl set-hostname k8s-01# 查看修改结果hostnamectl status# 设置 hostname 解析echo "127.0.0.1 $(hostname)" >> /etc/hosts
#关闭 selinux: sed -i 's/enforcing/disabled/' /etc/selinux/configsetenforce 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.confsed -i "s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g" /etc/sysctl.confsed -i "s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g" /etc/sysctl.confsed -i "s#^net.ipv6.conf.all.disable_ipv6.*#net.ipv6.conf.all.disable_ipv6=1#g" /etc/sysctl.confsed -i "s#^net.ipv6.conf.default.disable_ipv6.*#net.ipv6.conf.default.disable_ipv6=1#g" /etc/sysctl.confsed -i "s#^net.ipv6.conf.lo.disable_ipv6.*#net.ipv6.conf.lo.disable_ipv6=1#g" /etc/sysctl.confsed -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.confecho "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.confecho "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.confecho "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.confecho "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.confecho "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.confecho "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.9yum 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.9yum install -y docker-ce-19.03.9-3 docker-ce-cli-19.03.9 containerd.io
#启动服务systemctl start dockersystemctl enable docker
#配置加速sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{ "registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"]}EOFsudo systemctl daemon-reloadsudo systemctl restart docker
复制代码

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

# 配置K8S的yum源cat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF
# 卸载旧版本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
# 开机启动kubeletsystemctl enable kubelet && systemctl start kubelet
复制代码

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

############下载核心镜像 kubeadm config images list:查看需要哪些镜像###########
####封装成images.sh文件#!/bin/bashimages=( 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/$imageNamedone#####封装结束
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 ##获取集群中所有部署好的应用Podkubectl 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-commandkubeadm token create --ttl 0 --print-join-commandkubeadm 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-proxykubectl get pod -A|grep kube-proxykubectl delete pod kube-proxy-pqgnt -n kube-system### 修改完成后可以重启kube-proxy以生效
复制代码


发布于: 2022 年 07 月 23 日阅读数: 73
用户头像

Lansonli

关注

微信公众号:三帮大数据 2022.07.12 加入

CSDN大数据领域博客专家,华为云享专家、阿里云专家博主、腾云先锋(TDP)核心成员、51CTO专家博主,全网六万多粉丝,知名互联网公司大数据高级开发工程师

评论

发布
暂无评论
云原生(十一) | Kubernetes篇之Kubernetes原理与安装_云原生_Lansonli_InfoQ写作社区