热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

kubernetes(十五)kubernetes运维

k8s容器云平台技术落地方案机器选型: 虚拟机偶然宿主机操作系统版本内核版本节点管理节点亲和性污点容忍GPU资源node管理(标签或者备注)存储方案: ceph

k8s容器云平台技术落地方案

技术图片



  • 机器选型: 虚拟机偶然宿主机

  • 操作系统版本

  • 内核版本

  • 节点管理

    • 节点亲和性

    • 污点容忍

    • GPU资源node管理(标签或者备注)


  • 存储方案: ceph,GlusterFS,NFS

  • 网络方案:calico,flannel

  • 镜像仓库方案: harbor

  • 监控方案: prometheus+grafana+alertmanager

  • 日志方案: ELK

  • cicd方案:gitlab,build, harbor, jenkins-master-slave,helm发布到k8s集群


其他注意事项



  • 使用namespace隔离资源

    • 权限隔离

    • 资源隔离



Ansible自动化部署k8s集群


二进制部署k8s步骤

1、服务器初始化
2、部署etcd集群,包括生成证书
3、部署master(kube-apiserver、scheduler、controller-manager)
4、部署node(kubelet、proxy、docker)
5、部署网络组件、dashboard、ingress controller、配置pv自动供给、CoreDNS等


k8s集群软件下载地址



  • k8s-master&node: https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md#v1186

  • etcd: https://github.com/etcd-io/etcd/releases

  • cni 网络插件: https://github.com/containernetworking/plugins/releases

  • docker: https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz


ansible 部署k8s的playbook



  • 集群规划































主机名ip角色备注
centos7-node1192.168.56.11k8s-masteretcd-1
centos7-node2192.168.56.12k8s-node1etcd-2
centos7-node3192.168.56.13k8s-node2etcd-3


  • 脚本执行

$ yum -y install git epel-release ansible
$ git clone https://github.com/lizhenliang/ansible-install-k8s.git
$ mkdir ~/binary_pkg && cd binary_pkg #提供所需的软件包
$ cd ansible-install-k8s #修改,group_vars下的all.yml 指定对应路径和集群ip,修改文件下的hosts
$ ansible-playbook -i hosts single-master-deploy.yml #部署单master集群


  • 测试集群功能

$ kubectl create deploy web --image=lizhenliang/java-demo
$ kubectl expose deploy web --port=80 --target-port=8080 --type=NodePort

k8s高可用方案



  • etcd高可用

  • kube-apiserver高可用: 集群的统一入口;其他组件协作

  • kube-controller-manager高可用

  • kube-scheduler高可用

  • coreDNS高可用


Etcd数据库的备份与恢复


kubeadm集群的数据备份

ETCDCTL_API=3 etcdctl snapshot save snap.db --endpoints=https://192.168.56.11:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key

二进制部署的k8s集群数据备份

$ cd /data/etcd/bin
$ ETCDCTL_API=3 ./etcdctl snapshot save snap.db --endpoints=https://192.168.56.11:2379 --cacert=/data/etcd/ssl/ca.pem --cert=/data/etcd/ssl/server.pem --key=/data/etcd/ssl/server-key.pem

kubeadm集群etcd数据恢复

操作步骤如下:



  • 暂停kube-apiserver和etcd容器

  • 备份当前数据

mv /etc/kubernetes/manifests /etc/kubernetes/manifests.bak
mv /var/lib/etcd /var/lib/etcd.bak


  • 恢复数据

$ ETCDCTL_API=3 etcdctl snapshort restore snap.db --data-dir=/var/lib/etcd


  • 启动kube-apiserver和etcd容器

  • 恢复manifest

mv /etc/kubernetes/manifests.bak /etc/kubernetes/manifests

二进制部署k8s数据恢复

操作步骤如下:



  • 停止etcd和kube-apiserver

$ systemctl stop kube-apiserver
$ ansible etcd -m service -a "name=etcd state=stopped"
$ ansible etcd -m shell -a "mv /var/lib/etcd/default.etcd /var/lib/etcd/default.etcd.bak"


  • 数据恢复 (需要拷贝当前的备份数据到其余的节点,执行恢复命令即可)

$ cd /data/etcd/bin/ #恢复的数据备份至此
$ ansible etcd -m copy -a "src=/data/etcd/bin/snap.db dest=/data/etcd/bin/"
# etcd 节点1 执行如下命令
$ ETCDCTL_API=3 ./etcdctl snapshot restore snap.db --name etcd-1 --initial-cluster="etcd-1=https://192.168.56.11:2380,etcd-2=https://192.168.56.12:2380,etcd-3=https://192.168.56.13:2380" --initial-cluster-token=etcd-cluster --initial-advertise-peer-urls=https://192.168.56.11:2380 --data-dir=/var/lib/etcd/default.etcd
# etcd 节点2 执行如下命令
$ETCDCTL_API=3 ./etcdctl snapshot restore snap.db --name etcd-2 --initial-cluster="etcd-1=https://192.168.56.11:2380,etcd-2=https://192.168.56.12:2380,etcd-3=https://192.168.56.13:2380" --initial-cluster-token=etcd-cluster --initial-advertise-peer-urls=https://192.168.56.12:2380 --data-dir=/var/lib/etcd/default.etcd
# etcd 节点3 执行如下命令
$ETCDCTL_API=3 ./etcdctl snapshot restore snap.db --name etcd-3 --initial-cluster="etcd-1=https://192.168.56.11:2380,etcd-2=https://192.168.56.12:2380,etcd-3=https://192.168.56.13:2380" --initial-cluster-token=etcd-cluster --initial-advertise-peer-urls=https://192.168.56.13:2380 --data-dir=/var/lib/etcd/default.etcd


  • 启动etcd和kube-apiserver

$ systemctl start kube-apiserver
$ ansible etcd -m service -a "name=etcd state=started"
$ ansible

kubelet证书自动续签

二进制部署过程中,apiserver和etcd由cfssl或者openssl工具自签证书并可以定义过期时间,而kubelet连接apiserver所需的客户端证书是由controller-manager组件自动颁发,默认是一年,如果到期,kubelet将无法使用过期的证书连接apiserver,从而导致无法正常工作,日志会给出证书过期错误(x509: certificate has expired or is not yet valid)

解决该问题可启用kubelet证书轮转。


kubeadm部署方式

1、配置kube-controller-manager组件

vi /etc/kubernetes/manifests/kube-controller-manager.yaml
spec:
containers:
- command:
- kube-controller-manager
- --experimental-cluster-signing-duration=87600h0m0s
- --feature-gates=RotateKubeletServerCertificate=true

添加上述两个参数:



  • experimental-cluster-signing-duration=87600h0m0s 为kubelet客户端证书颁发有效期10年



  • feature-gates=RotateKubeletServerCertificate=true 启用server证书颁发

    配置完成后,重建pod使之生效:



kubectl delete pod kube-controller-manager-k8s-master -n kube-system

2、配置kubelet组件

默认kubelet证书轮转已启用。

# vi /var/lib/kubelet/config.yaml
...
rotateCertificates: true

3、测试

找一台节点测试,先查看现有客户端证书有效期:

# cd /var/lib/kubelet/pki
# openssl x509 -in kubelet-client-current.pem -noout -dates
notBefore=May 25 09:01:24 2020 GMT
notAfter=May 25 09:01:24 2021 GMT

修改服务器时间,模拟证书即将到期:

# date -s "2021-5-20"
# systemctl restart kubelet

再查看证书有效期,可以看到已经是十年:

# openssl x509 -in kubelet-client-current.pem -noout -dates
notBefore=Aug 8 15:44:55 2020 GMT
notAfter=May 23 09:05:30 2030 GMT

二进制部署方式

如果你采用老师的二进制方式部署,已经配置了默认是5年,所以在5年之前不会出现证书过期问题的。

找一台节点查看:

# cd /data/kubernetes/ssl
# openssl x509 -in kubelet-client-current.pem -noout -dates
notBefore=Aug 8 15:54:54 2020 GMT
notAfter=Aug 7 07:38:00 2025 GMT

为确保5年后证书能自动续签,还需要启用证书轮转和自动签发。

1、启用证书轮转

```bash]


vi /data/kubernetes/cfg/kubelet-config.yml

...
rotateCertificates: true


systemctl restart kubelet


**2、 配置kubelet证书申请自动签发**
```bash
#自动批准首次申请证书的 CSR 请求
kubectl create clusterrolebinding node-client-auto-approve-csr --clusterrole=system:certificates.k8s.io:certificatesigningrequests:nodeclient --user=kubelet-bootstrap
# 自动批准kubelet客户端证书续签
kubectl create clusterrolebinding node-client-auto-renew-crt --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeclient --group=system:nodes
# 自动批准kubelet服务端证书续签
kubectl create clusterrolebinding node-server-auto-renew-crt --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeserver --group=system:nodes二进制部署过程中,apiserver和etcd由cfssl或者openssl工具自签证书并可以定义过期时间,而kubelet连接apiserver所需的客户端证书是由controller-manager组件自动颁发,默认是一年,如果到期,kubelet将无法使用过期的证书连接apiserver,从而导致无法正常工作,日志会给出证书过期错误(x509: certificate has expired or is not yet valid)

解决该问题可启用kubelet证书轮转。


kubeadm部署方式

1、配置kube-controller-manager组件

vi /etc/kubernetes/manifests/kube-controller-manager.yaml
spec:
containers:
- command:
- kube-controller-manager
- --experimental-cluster-signing-duration=87600h0m0s
- --feature-gates=RotateKubeletServerCertificate=true

添加上述两个参数:
- experimental-cluster-signing-duration=87600h0m0s 为kubelet客户端证书颁发有效期10年
- feature-gates=RotateKubeletServerCertificate=true 启用server证书颁发
配置完成后,重建pod使之生效:
kubectl delete pod kube-controller-manager-k8s-master -n kube-system

2、配置kubelet组件

默认kubelet证书轮转已启用。

# vi /var/lib/kubelet/config.yaml
...
rotateCertificates: true

3、测试

找一台节点测试,先查看现有客户端证书有效期:

# cd /var/lib/kubelet/pki
# openssl x509 -in kubelet-client-current.pem -noout -dates
notBefore=May 25 09:01:24 2020 GMT
notAfter=May 25 09:01:24 2021 GMT
修改服务器时间,模拟证书即将到期:
# date -s "2021-5-20"
# systemctl restart kubelet
再查看证书有效期,可以看到已经是十年:
# openssl x509 -in kubelet-client-current.pem -noout -dates
notBefore=Aug 8 15:44:55 2020 GMT
notAfter=May 23 09:05:30 2030 GMT

二进制部署方式

如果你采用老师的二进制方式部署,已经配置了默认是5年,所以在5年之前不会出现证书过期问题的。

找一台节点查看:

# cd /opt/kubernetes/ssl
# openssl x509 -in kubelet-client-current.pem -noout -dates
notBefore=Aug 8 15:54:54 2020 GMT
notAfter=Aug 7 07:38:00 2025 GMT

为确保5年后证书能自动续签,还需要启用证书轮转和自动签发。

1、启用证书轮转

# vi /opt/kubernetes/cfg/kubelet-config.yml
...
rotateCertificates: true
# systemctl restart kubelet

2、 配置kubelet证书申请自动签发

#自动批准首次申请证书的 CSR 请求
kubectl create clusterrolebinding node-client-auto-approve-csr --clusterrole=system:certificates.k8s.io:certificatesigningrequests:nodeclient --user=kubelet-bootstrap
# 自动批准kubelet客户端证书续签
kubectl create clusterrolebinding node-client-auto-renew-crt --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeclient --group=system:nodes
# 自动批准kubelet服务端证书续签
kubectl create clusterrolebinding node-server-auto-renew-crt --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeserver --group=system:nodes

kubernetes集群故障排查思路


集群部署问题


kubeadm



  • 网络通信: 节点之间的通信(网络插件问题,镜像加速)

  • 证书错误: 时间同步问题,证书hosts缺ip,证书过期未续签


二进制部署



  • 服务启动异常: 配置文件检查,环境初始化检查


应用部署问题



  • 镜像拉取失败: 认证问题,secret配置需要根据namespace和业务的namespace对应



  • 调度类问题: 无法调度,一直Pending,需要查节点污点,调度策略,污点容忍,调度节点node问题



  • svc和deploy无法通信: namespace问题,多看看describe事件或者查看标签问题



    • ClusterIP数据包流程:
      用户->ClusterIP->iptables/ipvs->pod

    1、iptables模式

    iptables-save |grep web

    -A KUBE-SEP-D4VB4DJ76HXQK5R7 -p tcp -m comment --comment "default/web:" -m tcp -j DNAT --to-destination 10.244.1.4:8080
    -A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.0.0.149/32 -p tcp -m comment --comment "default/web: cluster IP" -m tcp --dport 80 -j KUBE-MARK-MASQ
    -A KUBE-SERVICES -d 10.0.0.149/32 -p tcp -m comment --comment "default/web: cluster IP" -m tcp --dport 80 -j KUBE-SVC-BIJGBSD4RZCCZX5R
    -A KUBE-SVC-BIJGBSD4RZCCZX5R -m comment --comment "default/web:" -j KUBE-SEP-D4VB4DJ76HXQK5R7

    10.0.0.80:80 -> 10.244.2.4:8080

    2、ipvs模式

    查看ipvs规则:ipvsadm -L -n

    ipvs0绑定clusterip,捕获数据包,根据ipvs规则转发后端。

    nodeport数据包流程:
    用户->nodeport->iptables/ipvs->pod



  • ingress冲突问题: 是否存在相同的ingress在不同namespace的情况


通用技巧

kubectl get svc,deploy,pod -n xxx
kubectl describe pod xxxx
kubectl exec -it podxxxx -c xxxx -n xxxx -- bash #进入指定容器

kubernetes(十五) kubernetes 运维



推荐阅读
  • 本文介绍了一种图片处理应用,通过固定容器来实现缩略图的功能。该方法可以实现等比例缩略、扩容填充和裁剪等操作。详细的实现步骤和代码示例在正文中给出。 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 大幅|大盘_OPLG:新一代云原生可观测最佳实践
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了OPLG:新一代云原生可观测最佳实践相关的知识,希望对你有一定的参考价值。简介: ... [详细]
author-avatar
cxsw01
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有