kubernetes基础

目录

今日内容概述

1.k8s简介
2.kubeadmin安装k8s

今日内容详细

1.k8s简介

Kubernetes是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes拥有一个庞大且快速增长的生态系统。Kubernetes的服务、支持和工具广泛可用。

    Kubernetes是一个全新的基于容器技术的分布式领先方案。简称:K8S。它是Google开源的容器集群管理系统,它的设计灵感来自于Google内部的一个叫作Borg的容器管理系统。继承了Google十余年的容器集群使用经验。它为容器化的应用提供了部署运行、资源调度、服务发现和动态伸缩等一些列完整的功能,极大地提高了大规模容器集群管理的便捷性。
    kubernetes是一个完备的分布式系统支撑平台。具有完备的集群管理能力,多扩多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、內建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制以及多粒度的资源配额管理能力。
    在集群管理方面,Kubernetes将集群中的机器划分为一个Master节点和一群工作节点Node,其中,在Master节点运行着集群管理相关的一组进程kube-apiserver、kube-controller-manager和kube-scheduler,这些进程实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理能力,并且都是全自动完成的。Node作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod。Node上运行着Kubernetes的kubelet、kube-proxy服务进程,这些服务进程负责Pod的创建、启动、监控、重启、销毁以及实现软件模式的负载均衡器。
    在Kubernetes集群中,它解决了传统IT系统中服务扩容和升级的两大难题。如果今天的软件并不是特别复杂并且需要承载的峰值流量不是特别多,那么后端项目的部署其实也只需要在虚拟机上安装一些简单的依赖,将需要部署的项目编译后运行就可以了。但是随着软件变得越来越复杂,一个完整的后端服务不再是单体服务,而是由多个职责和功能不同的服务组成,服务之间复杂的拓扑关系以及单机已经无法满足的性能需求使得软件的部署和运维工作变得非常复杂,这也就使得部署和运维大型集群变成了非常迫切的需求。
    Kubernetes的出现不仅主宰了容器编排的市场,更改变了过去的运维方式,不仅将开发与运维之间边界变得更加模糊,而且让DevOps这一角色变得更加清晰,每一个软件工程师都可以通过Kubernetes来定义服务之间的拓扑关系、线上的节点个数、资源使用量并且能够快速实现水平扩容、蓝绿部署等在过去复杂的运维操作。

架构

kubernetes基础

​ Kubernetes遵循非常传统的客户端服务端架构,客户端通过RESTful接口或者直接使用kubectl与Kubernetes集群进行通信,这两者在实际上并没有太多的区别,后者也只是对Kubernetes提供的RESTfulAPI进行封装并提供出来。每一个Kubernetes集群都由一组Master节点和一系列的Worker节点组成,其中Master节点主要负责存储集群的状态并为Kubernetes对象分配和调度资源。

Master节点

它主要负责接收客户端的请求,安排容器的执行并且运行控制循环,将集群的状态向目标状态进行迁移,Master节点内部由以下组件构成:

API Server
负责处理来自用户的请求,其主要作用就是对外提供了RESTful的接口,(这个接口可以被一些编程语言调用,用来对k8s进行二次开发)包括用于查看集群状态的读请求以及改变集群状态的写请求,也是唯一一个与etcd集群通信的组件
ControllerManager
管理器运行了一系列的控制器进程,这些进程会按照用户的期望状态在后台不断的调节整个集群中的对象,当服务的状态发生了改变,控制器就会发现这个改变并且开始向目标状态迁移
Scheduler
调度器其实为Kubernetes中运行的Pod选择部署的node节点,它会根据用户的需要选择最能满足请求的节点来运行Pod,它会在每次需要调度Pod时执行。

Node节点

Node节点的实现相对简单一点,主要是由kubelet和kube-proxy两部分组成:

kubelet是一个节点上的主要服务,它周期性地从APIServer接受新的或者修改Pod规范并且保证节点上的Pod和其中容器的正常运行,还会保证节点会向目标状态迁移,该节点仍然会向Master节点发送宿主机的健康状况。

kube-proxy负责宿主机的子网管理,同时也能将服务暴露给外部,其原理就是在多个隔离的网络中把请求转发给正确的Pod或者容器。

flannel网络图

功能:
    让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。但在默认的Docker配置中,每个Node的Docker服务会分别负责所在节点容器的IP分配。Node内部的容器之间可以相互访问,但是跨主机(Node)网络相互间是不能通信的。Flannel设计目的就是为集群中所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得"同属一个内网"且"不重复的"IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。
 
原理:
    Flannel 使用etcd存储配置数据和子网分配信息。flannel 启动之后,后台进程首先检索配置和正在使用的子网列表,然后选择一个可用的子网,然后尝试去注册它。etcd也存储这个每个主机对应的ip。flannel 使用etcd的watch机制监视/coreos.com/network/subnets下面所有元素的变化信息,并且根据它来维护一个路由表。为了提高性能,flannel优化了Universal TAP/TUN设备,对TUN和UDP之间的ip分片做了代理。
 
工作流程:
    1、数据从源容器中发出后,经由所在主机的docker0虚拟网卡转发到flannel0虚拟网卡,这是个P2P的虚拟网卡,flanneld服务监听在网卡的另外一端。
 
    2、Flannel通过Etcd服务维护了一张节点间的路由表,该张表里保存了各个节点主机的子网网段信息。
 
    3、源主机的flanneld服务将原本的数据内容UDP封装后根据自己的路由表投递给目的节点的flanneld服务,数据到达以后被解包,然后直接进入目的节点的flannel0虚拟网卡,然后被转发到目的主机的docker0虚拟网卡,最后就像本机容器通信一样的由docker0路由到达目标容器。

组件介绍

Master节点

组件名称 作用
apiserver(资源操作调度中心) 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
etcd(数据存储) 保存了整个集群的状态;
schedule(资源调度器) 负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
controller manager(控制管理器) 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;

Node节点

组件名称 作用
kubelet(部署、监控、维护容器) 负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
kube-proxy(负载、网络、服务发现) 负责为Service提供cluster内部的服务发现和负载均衡;

其他组件

组件名称 作用
flannerl 提供了集群间的网络
kube-dns 负责为整个集群提供DNS服务
lngress Controller 为服务提供外网入口
Heapster 提供资源监控
Dashboard 提供GUI
Federation 提供跨可用区的集群
Fluentd-elasticsearch 提供集群日志采集、存储与查询
rancher k8s管理工具

命令的运行过程

1、kubectl发送了一个部署nginx的任务
2、进入Master节点,进行安全认证,
3、认证通过后,APIserver接受指令
4、将部署的命令数据记录到etcd中
5、APIserver再读取etcd中的命令数据
6、APIserver找到scheduler(调度器),说要部署nginx
7、scheduler(调度器)找APIserver调取工作节点数据。
8、APIserver调取etcd中存储的数据,并将数据发给scheduler。
9、scheduler通过计算,比较找到适合部署nginx的最佳节点是node1,发送给APIserver。
10、APIserver将要部署在node1的计划存储到etcd中。
11、APIserver读取etcd中的部署计划,通知node1节点的kubelet部署容器
12、kubelet根据指令部署nginx容器,kube-proxy为nginx容器创建网桥
13、容器网桥部署完成后,kubelet通知APIserver部署工作完成。
14、APIserver将部署状态存储到etcd当中,同时通知controller manager(控制器)来活了
15、controller manager向APIserver要需要监控容器的数据
16、APIserver找etcd读取相应数据,同时通知kubelet要源源不断发送监控的数据
17、APIserver将kubelet发送来的数据存储到etcd当中
18、APIserver将etcd的数据返回给controller manager
19、controller manager根据数据计算判断容器是否存在或健康

2.kubeadmin安装k8s

机器环境准备(所有机器)

1.更新yum源

rm -rf /etc/yum.repos.d/*

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all && yum makecache

yum update -y --exclud=kernel*	# 更新系统软件(排除内核)

yum install wget expect vim net-tools ntp bash-completion ipvsadm ipset jq iptables conntrack sysstat libseccomp -y
# 安装基础常用软件

2.修改主机名,添加hosts解析以及DNS解析

修改主机名
hostnamectl set-hostname k8s-m-01
hostnamectl set-hostname k8s-n-01
hostnamectl set-hostname k8s-n-02

添加hosts解析
172.16.1.26 kub-m-01 m1
172.16.1.29 kub-n-01 n2
172.16.1.30 kub-n-02 n2

添加DNS解析
vim /etc/resolv.conf
# Generated by NetworkManager
search 8.8.8.8
nameserver 114.114.114.114

3.系统优化

# 关闭selinux
sed -i 's#enforcing#disabled#g' /etc/sysconfig/selinux
setenforce 0

# 关闭swap分区
swapoff -a
sed -i.bak 's/^.*centos-swap/#&/g' /etc/fstab

# kubelet忽略swap
echo 'KUBELET_EXTRA_ARGS="--fail-swap-on=false"' > /etc/sysconfig/kubelet 

# 主节点做免密登录
[root@k8s-m-01 ~]# ssh-keygen -t rsa
[root@k8s-m-01 ~]# for i in m1 n1 n2;do  ssh-copy-id -i ~/.ssh/id_rsa.pub root@$i; done

# 同步集群时间
echo '#Timing synchronization time' >>/var/spool/cron/root  #给定时任务加上注释
echo '0 */1 * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null' >>/var/spool/cron/root      #设置定时任务
crontab -l  #检查结果

# 更新系统内核(主要是docker要求系统内核版本4.4以上,所有机器都更新)
# 内核
wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-5.4.155-1.el7.elrepo.x86_64.rpm
# 内核扩展包
wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.155-1.el7.elrepo.x86_64.rpm
# 安装系统内核
yum localinstall -y kernel-lt*
#  调到默认启动
grub2-set-default  0 && grub2-mkconfig -o /etc/grub2.cfg
# 查看当前默认启动的内核
grubby --default-kernel
# 重启
reboot

# 安装 IPVS
yum install -y conntrack-tools ipvsadm ipset conntrack libseccomp
# 加载 IPVS 模块
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr
ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in \${ipvs_modules}; do
/sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1
if [ $? -eq 0 ]; then
/sbin/modprobe \${kernel_module}
fi
done
EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs

# 修改内核启动参数
cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp.keepaliv.probes = 3
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp.max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp.max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.top_timestamps = 0
net.core.somaxconn = 16384
EOF

# 立即生效
sysctl --system

4.安装docker

1.如果之前安装过docker,卸载
yum remove docker docker-common docker-selinux docker-engine -y
# 我们要考虑到的之后与kubernetes的兼容性问题,不会报莫名其妙的错误,我们选择安装docker-ce-19.03.9

2.安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2

3.安装yum源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

4.配置阿里云镜像加速
登录自己的阿里云账号,找到容器镜像服务 ACR,点击管理控制台,在“镜像工具处”找到镜像加速器,复制加速器地址	# 每个人的不一样
mkdir -p /etc/docker
cat >> /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://gfctbouf.mirror.aliyuncs.com"]
}
EOF

systemctl daemon-reload

5.安装Docker
yum install docker-ce-19.03.9 -y

6.启动并设置开机自启
systemctl enable --now docker

安装kubelet(所有机器都要做)

# 安装kebenetes yum 源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 安装kubelet
# 要安装什么版本的kubernetes,这边就安装相对应版本的控制面板,否则可能出现控制面板不支持当前的kubernetes版本
yum install kubelet-1.21.3 kubeadm-1.21.3 kubectl-1.21.3 -y 
# 当前为1.21.3版本
# 设置开机自启动
systemctl enable --now kubelet

初始化master节点(仅在master节点上执行)

1.查看官网镜像下载版本
# 不同版本的kubelet(控制平面)支持的kubernetes版本不同,以及所需的镜像版本不同。
kubeadm config images list
I1031 13:22:32.954067   20870 version.go:254] remote version is much newer: v1.22.3; falling back to: stable-1.21
k8s.gcr.io/kube-apiserver:v1.21.3
k8s.gcr.io/kube-controller-manager:v1.21.3
k8s.gcr.io/kube-scheduler:v1.21.3
k8s.gcr.io/kube-proxy:v1.21.3
k8s.gcr.io/pause:3.4.1
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns/coredns:v1.8.0

2.Github构建自己的镜像,关联到阿里云中构建	#(跳过),反正就是自己搞个镜像仓库,然后把对应版本组件的镜像搞到自己的仓库里,然后msater节点登录进自己的仓库把镜像拉取到本地即可

3.修改成刚刚构建成功的仓库
[root@k8s-m-01 ~]# kubeadm config images list --image-repository=registry.cn-shanghai.aliyuncs.com/jerrylty98

4.如果创建的库是私有库,初始化开始前,登录私有库	#(跳过,已设为公有库)

初始化后续(仅在master节点上执行)

1.kubeadm init --image-repository=registry.cn-hangzhou.aliyuncs.com/k8sos  --kubernetes-version=v1.21.3 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
开始下载所需镜像,可以在docker images 查看

2.初始化成功后,建立用户集群权限
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 如果是root用户,则可以直接使用:export KUBECONFIG=/etc/kubernetes/admin.conf

3.安装集群网络插件(flannel.yaml)见附件
# 手动拉取flannel网络插件(不知道为什么,初始化没有拉取这个插件)
docker pull registry.cn-hangzhou.aliyuncs.com/jerrytest98/flannel:v0.15.0

[root@k8s-m-01 ~]# vi flannel.yaml
# 把附件内容粘贴进去保存,执行下方命令,!!!用vi,不要用vim,不信试试看会发生什么...
kubectl apply -f flannel.yaml

4.将工作节点加入集群
[root@k8s-m-01 ~]# kubeadm token create    --print-join-command
kubeadm join 192.168.174.26:6443 --token i560xg.qgmf3bk0ffddm0wf --discovery-token-ca-cert-hash sha256:eb188aaeaaf8553120982c5b218849cb7806b1dbff1df24994043bfa5291849f 
# 注:将上方生成的token复制到node节点上执行

5.检查集群状态
# 第一种方式
[root@kub-m-01 ~]# kubectl get nodes
NAME       STATUS   ROLES                  AGE   VERSION
kub-m-01   Ready    control-plane,master   40h   v1.21.3
kub-n-01   Ready    <none>                 40h   v1.21.3
kub-n-02   Ready    <none>                 40h   v1.21.3
# 第二种方式
[root@kub-m-01 ~]# kubectl get pods -n kube-system
NAME                               READY   STATUS    RESTARTS   AGE
coredns-978bbc4b6-7dxkh            1/1     Running   1          40h
coredns-978bbc4b6-j76bs            1/1     Running   1          40h
etcd-kub-m-01                      1/1     Running   1          40h
kube-apiserver-kub-m-01            1/1     Running   1          40h
kube-controller-manager-kub-m-01   1/1     Running   1          40h
kube-flannel-ds-c74ct              1/1     Running   1          40h
kube-flannel-ds-dqd92              1/1     Running   1          40h
kube-flannel-ds-pl7d5              1/1     Running   1          40h
kube-proxy-jxxzk                   1/1     Running   1          40h
kube-proxy-n45q4                   1/1     Running   1          40h
kube-proxy-qm9t5                   1/1     Running   1          40h
kube-scheduler-kub-m-01            1/1     Running   1          40h

# 第三种方式:直接验证集群DNS
[root@k8s-m-01 ~]# kubectl run test -it --rm --image=busybox:1.28.3
If you don't see a command prompt, try pressing enter.
/ # nslookup kubernetes	(输入左边内容)
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
# exit退出

附件

---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: psp.flannel.unprivileged
  annotations:
    seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default
    seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default
    apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default
    apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
spec:
  privileged: false
  volumes:
  - configMap
  - secret
  - emptyDir
  - hostPath
  allowedHostPaths:
  - pathPrefix: "/etc/cni/net.d"
  - pathPrefix: "/etc/kube-flannel"
  - pathPrefix: "/run/flannel"
  readOnlyRootFilesystem: false
  # Users and groups
  runAsUser:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  fsGroup:
    rule: RunAsAny
  # Privilege Escalation
  allowPrivilegeEscalation: false
  defaultAllowPrivilegeEscalation: false
  # Capabilities
  allowedCapabilities: ['NET_ADMIN', 'NET_RAW']
  defaultAddCapabilities: []
  requiredDropCapabilities: []
  # Host namespaces
  hostPID: false
  hostIPC: false
  hostNetwork: true
  hostPorts:
  - min: 0
    max: 65535
  # SELinux
  seLinux:
    # SELinux is unused in CaaSP
    rule: 'RunAsAny'
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: flannel
rules:
- apiGroups: ['extensions']
  resources: ['podsecuritypolicies']
  verbs: ['use']
  resourceNames: ['psp.flannel.unprivileged']
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes/status
  verbs:
  - patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: flannel
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: flannel
subjects:
- kind: ServiceAccount
  name: flannel
  namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: flannel
  namespace: kube-system
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: kube-flannel-cfg
  namespace: kube-system
  labels:
    tier: node
    app: flannel
data:
  cni-conf.json: |
    {
      "name": "cbr0",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "flannel",
          "delegate": {
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        },
        {
          "type": "portmap",
          "capabilities": {
            "portMappings": true
          }
        }
      ]
    }
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds
  namespace: kube-system
  labels:
    tier: node
    app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/os
                operator: In
                values:
                - linux
      hostNetwork: true
      priorityClassName: system-node-critical
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni-plugin
        image: rancher/mirrored-flannelcni-flannel-cni-plugin:v1.2
        command:
        - cp
        args:
        - -f
        - /flannel
        - /opt/cni/bin/flannel
        volumeMounts:
        - name: cni-plugin
          mountPath: /opt/cni/bin
      - name: install-cni
        image: registry.cn-hangzhou.aliyuncs.com/jerrytest98/flannel:v0.15.0
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
        image: registry.cn-hangzhou.aliyuncs.com/jerrytest98/flannel:v0.15.0
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
            add: ["NET_ADMIN", "NET_RAW"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      volumes:
      - name: run
        hostPath:
          path: /run/flannel
      - name: cni-plugin
        hostPath:
          path: /opt/cni/bin
      - name: cni
        hostPath:
          path: /etc/cni/net.d
      - name: flannel-cfg
        configMap:
          name: kube-flannel-cfg
上一篇:K8S 多 Maser 集群架构和 Dashboard UI 的二进制部署(遇到事情就问自己会不会死。会,那不能搞。)


下一篇:利用kubeadm快速搭建Kubernetes学习环境