K8S调优 [TOC]
一.健康检查 题目要求 1 2 3 4 5 6 7 8 9 10 11 12 1.健康检查--ExecAction 在 master 节点/root 目录下编写 yaml 文件 liveness_exec.yaml,具体要求如下: (1)Pod 名称:liveness-exec; (2)命名空间:default; (3)镜像:busybox;容器名称:liveness; (4)容器启动时运行命令“touch /tmp/healthy; sleep 60; rm -rf /tmp/healthy; sleep 600”, 此命令在容器启动时创建/tmp/healthy 文件,并于 60 秒之后将其删除; (5)存活性探针运行“test -e /tmp/healthy”命令检查文件的存在性,若文件存在则返 回状态码为 0,表示成功通过测试; (6)启动后延时 5 秒开始运行检测; (7)每隔 5 秒执行一次 liveness probe。 完成后使用该 yaml 文件创建 Pod
1.解决方法 1 2 在root目录下创建 live-ness.yaml文件 #vi live-ness.yaml
①编写yaml文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 apiVersion: v1 kind: Pod metadata: labels: test: liveness name: liveness-exec spec: containers: - name: liveness image: busybox args: - /bin/sh - -c - touch /tmp/healthy; sleep 60 ; rm -rf /tmp/healthy; sleep 600 livenessProbe: exec: command: - test - -e - /tmp/healthy initialDelaySeconds: 5 periodSeconds: 5
②最后可观察到pod会重启,任务完成。 二.更新证书 题目要求 1 2 3 2.更新证书 Kubernetes 默认的证书有效期只有一年时间,对于某些场景下一个足够长的证书有效期 是非常有必要的。请将 Kubernetes 集群证书的有效期延长至 10 年。
1. go环境部署 1 2 3 4 5 6 wget https://dl.google.com/go/go1.12.7.linux-amd64.tar.gz tar -zxvf go1.12.7.linux-amd64.tar.gz -C /usr/local vi /etc/profile #修改的内容放在最后即可 export PATH=$PATH:/usr/local/go/bin source /etc/profile #让文件生效
2.下载源码 1 2 cd /data && git clone https://github.com/kubernetes/kubernetes.git git checkout -b remotes/origin/release-1.15.1 v1.15.1
3.修改 kubeadm 源码包更新证书策略 1 2 3 4 5 6 7 8 cd kubernetesvi staging/src/k8s.io/client-go/util/cert/cert.go vi cmd/kubeadm/app/util/pkiutil/pki_helpers.go const duration3650d = time.Hour * 24 *365 * 10 NotAfter: time.Now().Add(duration3650d).UTC(), make WHAT=cmd/kubeadm GOFLAGS=-v cp _output/bin/kubeadm /root/kubeadm-new
4.更新 kubeadm 1 2 3 4 # 将 kubeadm 进行替换 cp /usr/bin/kubeadm /usr/bin/kubeadm.old cp /root/kubeadm-new /usr/bin/kubeadm chmod a+x /usr/bin/kubeadm
5.更新各节点证书至Master节点 1 2 3 4 5 cp -r /etc/kubernetes/pki /etc/kubernetes/pki.old cd /etc/kubernetes/pki kubeadm alpha certs renew all --config=/root/kubeadm-config.yaml # 若没有该文件可以使用kubeadm config print init-defaults > kubeadm-config.yaml 用来生成kubeadm-config.yaml 文件 openssl x509 -in apiserver.crt -text -noout | grep Not
6. HA集群其余master节点证书更新
三.自定义资源管理(CRD) CRD简介 Custom resources:是对K8S API的扩展,代表了一个特定的kubetnetes的定制化安装。在一个运行中的集群中,自定义资源可以动态注册到集群中。注册完毕以后,用户可以通过kubelet创建和访问这个自定义的对象,类似于操作pod一样。
Custom controllers:Custom resources可以让用户简单的存储和获取结构化数据。只有结合控制器才能变成一个真正的declarative API(被声明过的API)。控制器可以把资源更新成用户想要的状态,并且通过一系列操作维护和变更状态。定制化控制器是用户可以在运行中的集群内部署和更新的一个控制器,它独立于集群本身的生命周期。 定制化控制器可以和任何一种资源一起工作,当和定制化资源结合使用时尤其有效。
Operator模式 是一个customer controllers和Custom resources结合的例子。它可以允许开发者将特殊应用编码至kubernetes的扩展API内。
题目要求: 1 2 3 4 5 6 7 8 3.自定义资源管理 在 Kubernetes 中一切都可视为资源,通过自定义资源我们可以向 Kubernetes API 中增 加新资源类型。在 master 节点/root 目录下编写 yaml 文件 resource.yaml,具体要求如下: (1)自定义资源名称:crontabs.stable.example.com; (2)指定自定义资源作用范围为命名空间; (3)指定每个版本都可以通过 served 标志来独立启用或禁止; (4)指定其中有且只有一个版本必需被标记为存储版本 v1。 完成后使用该 yaml 文件创建自定义资源
1.编写crontab_crd.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: # 称必须与下面的spec字段匹配,格式为: <plural>.<group> name: crontabs.crd.test.com spec: # 用于REST API的组名称: /apis/<group>/<version> group: crd.test.com versions: - name: v1 # 每个版本都可以通过服务标志启用/禁用。 served: true # 必须将一个且只有一个版本标记为存储版本。 storage: true scope: Namespaced # 指定crd资源作用范围在命名空间或集群 names: # URL中使用的复数名称: /apis/<group>/<version>/<plural> plural: crontabs # 在CLI(shell界面输入的参数)上用作别名并用于显示的单数名称 singular: crontab kind: CronTab # 短名称允许短字符串匹配CLI上的资源,意识就是能通过kubectl 在查看资源的时候使用该资源的简名称来获取。 shortNames: - ct
2.创建crd 1 2 kubectl apply -f crontab_crd.yml kubectl get crd | grep crontab #查看crd
3.编写测试文件test_crontab.yaml 1 2 3 4 5 6 7 8 9 apiVersion: crd.test.com/v1 kind: CronTab metadata: name: my-test-crontab spec: cronSpec: "* * * * */10" image: my-test-image replicas: 2
4.创建测试文件并检查是否成功 1 2 kubectl apply -f test_crontab.yml kubectl get ct
5.删除自定义对象 1 2 3 kubectl delete ct my-test-crontab #删除自定义对象 kubectl delete crd crontabs.crd.test.com #删除crd
四.HPA管理 原理: HPA可以获取每个Pod利用率,然后和HPA中定义的指标进行对比,同时计算出需要伸缩的具体值,最后实现Pod的数量的调整。其实HPA与之前的Deployment一样,也属于一种Kubernetes资源对象,它通过追踪分析RC控制的所有目标Pod的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数,这是HPA的实现原理。
题目要求 在 master 节点/root 目录下编写 yaml 文件 deployment-hpa.yaml,具体要求如下: (1)HPA 名称:deployment-hpa; (2)命名空间:default; (3)基于 deployment 进行伸缩,副本数伸缩范围:1–10; (4)期望每个 Pod 的 CPU 和内存使用率为 50%。 完成后使用该 yaml 文件创建 HPA
1.安装metrics-server (用来收集集群中的资源使用情况)
1 2 3 4 # 安装git wget -c https://github.com/kubernetes-sigs/metrics-server/archive/v0.3.6.zip # 解压文件 unzip v0.3.6.zip
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 cd /root/metrics-server/deploy/1.8+/ vi metrics-server-deployment.yaml apiVersion: v1 kind: ServiceAccount metadata: name: metrics-server namespace: kube-system --- apiVersion: apps/v1 kind: Deployment metadata: name: metrics-server namespace: kube-system labels: k8s-app: metrics-server spec: selector: matchLabels: k8s-app: metrics-server template: metadata: name: metrics-server labels: k8s-app: metrics-server spec: serviceAccountName: metrics-server volumes: - name: tmp-dir emptyDir: {} containers: - name: metrics-server image: k8s.gcr.io/metrics-server-amd64:v0.3.6 imagePullPolicy: IfNotPresent command: - /metrics-server - --kubelet-preferred-address-types=InternalIP - --kubelet-insecure-tls volumeMounts: - name: tmp-dir mountPath: /tmp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 kubectl apply -f . kubectl get pod -n kube-system metrics-server-6b976979db-2xwbj 1/1 Running 0 90s kubectl top node NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% k8s-master01 289m 14% 1582Mi 54% k8s-node01 81m 4% 1195Mi 40% k8s-node02 72m 3% 1211Mi 41% kubectl top pod -n kube-system NAME CPU(cores) MEMORY(bytes) coredns-6955765f44-7ptsb 3m 9Mi coredns-6955765f44-vcwr5 3m 8Mi etcd-master 14m 145Mi ...
2.准备deployment和service 创建pc-hpa-pod.yaml文件,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 apiVersion: apps/v1 kind: Deployment metadata: name: nginx namespace: default spec: replicas: 1 selector: matchLabels: app: nginx-pod template: metadata: labels: app: nginx-pod spec: containers: - name: nginx image: nginx:1.17.1 resources: limits: cpu: "1" requests: cpu: "100m"
1 2 # 创建service kubectl expose deployment nginx --type=NodePort --port=80
3.创建HPA
创建pc-hpa.yaml文件,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: name: pc-hpa namespace: default spec: minReplicas: 1 maxReplicas: 10 targetCPUUtilizationPercentage: 3 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx
1 2 3 4 5 6 7 8 [root@k8s-master01 1.8 + ] horizontalpodautoscaler.autoscaling/pc-hpa created [root@k8s-master01 1.8 + ] NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE pc-hpa Deployment/nginx 0 %/3% 1 10 1 62s
4.测试 使用压测工具对service地址10.1.0.100:31830
进行压测,然后通过控制台查看hpa和pod的变化
hpa变化
deployment变化
五.NetworkPolicy 管理 题目要求: 在 master 节点/root 目录下编写 yaml 文件 network-policy-deny.yaml,具体要求如下: (1)NetworkPolicy 名称:default-deny; (2)命名空间:default; (3)默认禁止所有入 Pod 流量。 完成后使用该 yaml 文件创建 NetworkPolicy
注意需要安装插件并且需要较高的K8S版本以
[v1.21.1为例]:
1.部署网络 注意:
CNI插件需要启用,Calico安装为CNI插件。必须通过传递--network-plugin=cni
参数将kubelet配置为使用CNI网络。(在kubeadm上,这是默认设置。)
我们这里使用Kubernetes的etcd进行安装,首先确保Kubernetes设置--cluster-cidr=10.244.0.0/16
和--allocate-node-cidrs=true
。(kubeadm是默认安装的)
我们集群启动了RBAC,所以要创建RBAC
1 kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/canal/rbac.yaml
安装calico
1 2 kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/canal/canal.yaml
①下载 calico 网络需要用到的镜像 1 2 3 4 docker pull docker.io/calico/cni:v3.21.1 docker pull docker.io/calico/pod2daemon-flexvol:v3.21.1 docker pull docker.io/calico/node:v3.21.1 docker pull docker.io/calico/kube-controllers:v3.21.1
更改网络类型 1 kubectl delete -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
②下载calico网络的yaml部署文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 获取calico的yaml文件 wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate # 查看镜像是否正确 cat calico.yaml | grep image image: docker.io/calico/cni:v3.21.1 image: docker.io/calico/cni:v3.21.1 image: docker.io/calico/pod2daemon-flexvol:v3.21.1 image: docker.io/calico/node:v3.21.1 image: docker.io/calico/kube-controllers:v3.21.1 # 部署网络 kubectl apply -f calico.yaml # 查看pod是否正常运行 kubectl get pods -A
2.定义一个入站流量拒绝的规则 1 2 3 4 5 6 7 8 9 10 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-all-policy spec: podSelector: {} policyTypes: - Ingress $ kubectl apply -f network-policy.yaml -n dev
3.在dev和prod的namespace下个各自创建一个pod 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 apiVersion: v1 kind: Pod metadata: name: pod-1 labels: name: myapp spec: containers: - name: myapp image: ikubernetes/myapp:v1 $ kubectl apply -f policy-pod.yaml -n dev $ kubectl apply -f policy-pod.yaml -n prod $ kubectl get pod -o wide -n prod NAME READY STATUS RESTARTS AGE IP NODE pod-1 1/1 Running 0 3h 10.244.2.3 k8s-node02 $ kubectl get pod -owide -n dev NAME READY STATUS RESTARTS AGE IP NODE pod-1 1/1 Running 0 3h 10.244.2.2 k8s-node02 $ curl 10.244.2.3 Hello MyApp | Version: v1 | <a href="hostname.html" >Pod Name</a> $ 10.244.2.2 不通
六.k8s安装v2.21.1 2.6 系统初始化 2.6.1 设置系统主机名以及 Host 文件的相互解析 1 2 3 hostnamectl set-hostname k8s-master01 && bash hostnamectl set-hostname k8s-node01 && bash hostnamectl set-hostname k8s-node02 && bash
1 2 3 4 5 cat <<EOF>> /etc/hosts 192.168.5.3 k8s-master01 192.168.5.4 k8s-node01 192.168.5.5 k8s-node02 EOF
1 2 scp /etc/hosts root@192.168.5.4:/etc/hosts scp /etc/hosts root@192.168.5.5:/etc/hosts
2.6.2 安装依赖文件(所有节点都要操作) 1 yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
2.6.3 设置防火墙为 Iptables 并设置空规则(所有节点都要操作) 1 2 3 systemctl stop firewalld && systemctl disable firewalld yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
2.6.4 关闭 SELINUX(所有节点都要操作) 1 2 3 swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
2.6.5 调整内核参数,对于 K8S(所有节点都要操作) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 modprobe br_netfilter cat <<EOF> kubernetes.conf net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 net.ipv4.tcp_tw_recycle=0 vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它 vm.overcommit_memory=1 # 不检查物理内存是否够用 vm.panic_on_oom=0 # 开启 OOM fs.inotify.max_user_instances=8192 fs.inotify.max_user_watches=1048576 fs.file-max=52706963 fs.nr_open=52706963 net.ipv6.conf.all.disable_ipv6=1 net.netfilter.nf_conntrack_max=2310720 EOF cp kubernetes.conf /etc/sysctl.d/kubernetes.conf sysctl -p /etc/sysctl.d/kubernetes.conf
2.6.6 调整系统时区(所有节点都要操作) 1 2 3 4 5 6 7 # 设置系统时区为 中国/上海 timedatectl set-timezone Asia/Shanghai # 将当前的 UTC 时间写入硬件时钟 timedatectl set-local-rtc 0 # 重启依赖于系统时间的服务 systemctl restart rsyslog systemctl restart crond
2.6.7 设置 rsyslogd 和 systemd journald(所有节点都要操作) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 # 持久化保存日志的目录 mkdir /var/log/journal mkdir /etc/systemd/journald.conf.d cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF [Journal] # 持久化保存到磁盘 Storage=persistent # 压缩历史日志 Compress=yes SyncIntervalSec=5m RateLimitInterval=30s RateLimitBurst=1000 # 最大占用空间 10G SystemMaxUse=10G # 单日志文件最大 200M SystemMaxFileSize=200M # 日志保存时间 2 周 MaxRetentionSec=2week # 不将日志转发到 syslog ForwardToSyslog=no EOF systemctl restart systemd-journald
2.6.8 kube-proxy开启ipvs的前置条件(所有节点都要操作) 1 2 3 4 5 6 7 8 9 10 cat <<EOF> /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 && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
2.6.9 安装 Docker 软件(所有节点都要操作) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install -y docker-ce # mkdir /etc/docker cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" } } EOF mkdir -p /etc/systemd/system/docker.service.d # 重启docker服务 systemctl daemon-reload && systemctl restart docker && systemctl enable docker
上传文件到/etc/yum.repos.d/
目录下,也可以 代替 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
命令
docker-ce.repo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 [docker-ce-stable] name=Docker CE Stable - $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/stable enabled=1 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-stable-debuginfo] name=Docker CE Stable - Debuginfo $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/stable enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-stable-source] name=Docker CE Stable - Sources baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/stable enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-test] name=Docker CE Test - $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/test enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-test-debuginfo] name=Docker CE Test - Debuginfo $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/test enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-test-source] name=Docker CE Test - Sources baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/test enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-nightly] name=Docker CE Nightly - $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/nightly enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-nightly-debuginfo] name=Docker CE Nightly - Debuginfo $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/nightly enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg [docker-ce-nightly-source] name=Docker CE Nightly - Sources baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/nightly enabled=0 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
2.6.10 安装 Kubeadm (所有节点都要操作) 1 2 3 4 5 6 7 8 9 10 11 12 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 install -y kubelet-1.21.1 kubeadm-1.21.1 kubectl-1.21.1 && systemctl enable kubelet
2.7 部署Kubernetes Master 2.7.1 初始化主节点(主节点操作) 1 2 3 4 5 6 7 kubeadm init --apiserver-advertise-address=192.168.5.3 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.21.1 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
2.7.2 加入主节点以及其余工作节点 1 2 kubeadm join 192.168.5.3:6443 --token h0uelc.l46qp29nxscke7f7 \ --discovery-token-ca-cert-hash sha256:abc807778e24bff73362ceeb783cc7f6feec96f20b4fd707c3f8e8312294e28f
2.7.3 部署网络 1 kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
下边是文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 --- 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 runAsUser: rule: RunAsAny supplementalGroups: rule: RunAsAny fsGroup: rule: RunAsAny allowPrivilegeEscalation: false defaultAllowPrivilegeEscalation: false allowedCapabilities: ['NET_ADMIN' , 'NET_RAW' ] defaultAddCapabilities: [] requiredDropCapabilities: [] hostPID: false hostIPC: false hostNetwork: true hostPorts: - min: 0 max: 65535 seLinux: 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 image: quay.io/coreos/flannel:v0.14.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: quay.io/coreos/flannel:v0.14.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 hostPath: path: /etc/cni/net.d - name: flannel-cfg configMap: name: kube-flannel-cfg
六.修改Pod数量限制 题目要求
Kubernetes 默认每个节点只能启动 110 个 Pod,由于业务需要,将每个节点默认限制的Pod 数量改为 200。
1.方法一 ①在Node上 设置打开文件/var/lib/kubelet/config.yaml 1 vi /var/lib/kubelet/config.yaml
②修改参数maxPods为指定的值:
③重启kubelet 1 2 systemctl daemon-reload systemctl restart kubelet
④查看Pod数量 1 kubectl describe node | grep -i "Capacity\|Allocatable" -A 6
2.方法二 ①编辑kubelet环境配置文件,添加参数 1 2 3 vi /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS="--max-pods=200"
②编辑kubelet服务文件,写入环境文件路径 1 2 3 4 5 vi /usr/lib/systemd/system/kubelet.service [Service] Environment=-/etc/sysconfig/kubele
②重启kubelet 1 2 3 systemctl daemon-reload systemctl restart kubelet
七.修改 NodePort 端口范围 1.修改kube-apiserver.yaml 文件 使用 kubeadm 安装 K8S 集群的情况下,您的 Master 节点上会有一个文件 /etc/kubernetes/manifests/kube-apiserver.yaml,修改此文件, 向command添加 –service-node-port-range=20000-65535 (请使用您自己需要的端口范围),如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 vi /etc/kubernetes/manifests/kube-apiserver.yaml apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: component: kube-apiserver tier: control-plane name: kube-apiserver namespace: kube-system spec: containers: - command: - kube-apiserver - --advertise-address=172.17.216.80 - --allow-privileged=true - --authorization-mode=Node,RBAC - --client-ca-file=/etc/kubernetes/pki/ca.crt - --enable-admission-plugins=NodeRestriction - --enable-bootstrap-token-auth=true - --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt - --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt - --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key - --etcd-servers=https://127.0.0.1:2379 - --insecure-port=0 - --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt - --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname - --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt - --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key - --requestheader-allowed-names=front-proxy-client - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt - --requestheader-extra-headers-prefix=X-Remote-Extra- - --requestheader-group-headers=X-Remote-Group - --requestheader-username-headers=X-Remote-User - --secure-port=6443 - --service-account-key-file=/etc/kubernetes/pki/sa.pub - --service-cluster-ip-range=10.96.0.0/12 - --service-node-port-range=20000-22767 - --tls-cert-file=/etc/kubernetes/pki/apiserver.crt - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.16.0 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 8 httpGet: host: 172.17 .216 .80 path: /healthz port: 6443 scheme: HTTPS initialDelaySeconds: 15 timeoutSeconds: 15
2.重启APIServer
1 2 3 4 5 # 获得 apiserver 的 pod 名字 export apiserver_pods=$(kubectl get pods --selector=component=kube-apiserver -n kube-system --output=jsonpath={.items..metadata.name}) # 删除 apiserver 的 pod kubectl delete pod $apiserver_pods -n kube-system
3.验证成果
1 2 kubectl describe pod $apiserver_pods -n kube-system