Kubernetes 容器云平台技术方案

Kubernetes 容器云平台技术方案:存储

Ceph是一个高性能的分布式存储系统,提供对象存 储、块存储和文件存储功能,可存储海量数据。 角色:Pod数据持久化存储

Kubernetes 容器云平台技术方案:网络

Calico是一个纯三层的数据中心网络方案,Calico支 持广泛的平台,包括Kubernetes、OpenStack等。 Calico 在每一个计算节点利用 Linux Kernel 实现了 一个高效的虚拟路由器( vRouter) 来负责数据转发, 而每个 vRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络内传播。 此外,Calico 项目还实现了 Kubernetes 网络策略, 提供ACL功能。

Kubernetes 容器云平台技术方案:监控

Prometheus是SoundCloud开源的一款监控 系统。它的实现参考了Google内部的监控系 统,并支持在Kubernetes自动发现被监控端。 是目前Kubernetes监控首选方案。

Pod

kubelet的节点使用cAdvisor提供的metrics接口获取该节点所有 Pod和容器相关的性能指标数据。 指标接口:https://NodeIP:10250/metrics/cadvisor

Node

使用node_exporter收集器采集节点资源利用率。

项目地址:https://github.com/prometheus/node_exporter

K8s资源对象

kube-state-metrics采集了k8s中各种资源对象的状态信息。 项目地址:https://github.com/kubernetes/kube-state-metrics

Kubernetes 容器云平台技术方案:日志

ELK 是三个开源软件的缩写,提供一套完整的企业级日 志平台解决方案。

分别是:

  • Elasticsearch:搜索、分析和存储数据

  • Logstash :采集日志、格式化、过滤,最后将数据 推送到Elasticsearch存储

  • Kibana:数据可视化

  • Beats :集合了多种单一用途数据采集器,用于实 现从边缘机器向 Logstash 和 Elasticsearch 发送数 据。里面应用最多的是Filebeat,是一个轻量级日 志采集器。

Kubernetes 容器云平台技术方案:CI/CD

其他事项

  • 选择物理机还是虚拟机?

  • Linux操作系统选哪个好

  • 内核是否需要升级?

  • 使用命名空间隔离环境

  • 使用RBAC分配权限

  • 对于应用者来说,K8s编排和应用学习成本大,应平台化操作

自动化部署 Kubernetes 集群

有哪些自动化部署工具?

kubeadm

https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

kops

https://kubernetes.io/docs/setup/production-environment/tools/kops/

https://github.com/kubernetes/kops

kubespray

https://kubernetes.io/docs/setup/production-environment/tools/kubespray/

https://github.com/kubernetes-sigs/kubespray

Ansible Playbook自动化部署K8s集群:https://gitee.com/lucky_liuzhe/ansible-install-k8s

为什么自己造轮子?

  • 进一步熟悉k8s

  • 方便部署

  • 更易于维护

Kubernetes 高可用方案

  • Etcd高可用

  • kube-apiserver高可用

  • kube-controller-manager与kube-scheduler高可用

  • CoreDNS高可用

Kubernetes 数据库 Etcd 备份与恢复

Kubernetes 使用 Etcd 数据库实时存储集群中的数据,安全起见,一定要备份!

kubeadm部署方式:

备份:

1.安装etcdctl命令

yum -y install etcd (里面包含ectdctl客户端命令)

2.备份

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

恢复:

1、先暂停kube-apiserver和etcd容器

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

2、恢复

ETCDCTL_API=3 etcdctl \
snapshot restore snap.db \
--data-dir=/var/lib/etcd

3、启动kube-apiserver和etcd容器

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

二进制部署方式:

备份:

1.备份

ETCDCTL_API=3 /opt/etcd/bin/etcdctl \
snapshot save snap.db \
--endpoints=https://192.168.0.11:2379 \
--cacert=/opt/etcd/ssl/ca.pem \
--cert=/opt/etcd/ssl/server.pem \
--key=/opt/etcd/ssl/server-key.pem

2.拷贝备份数据到另两个etcd节点

scp snap.db root@192.168.0.12:~
scp snap.db root@192.168.0.13:~

恢复:

1、先暂停kube-apiserver和etcd

#所有master节点操作
systemctl stop kube-apiserver
#所有etcd节点操作
systemctl stop etcd
mv /var/lib/etcd/default.etcd /var/lib/etcd/default.etcd.bak

2、在每个节点上恢复

ETCDCTL_API=3 /opt/etcd/bin/etcdctl snapshot restore snap.db \
--name etcd-1 \
--initial-cluster="etcd-1=https://192.168.0.11:2380,etcd2=https://192.168.0.12:2380,etcd-3=https://192.168.0.13:2380" \
--initial-cluster-token=etcd-cluster \
--initial-advertise-peer-urls=https://192.168.0.11:2380 \
--data-dir=/var/lib/etcd/default.etcd

ETCDCTL_API=3 /opt/etcd/bin/etcdctl snapshot restore snap.db \
--name etcd-2 \
--initial-cluster="etcd-1=https://192.168.0.11:2380,etcd2=https://192.168.0.12:2380,etcd-3=https://192.168.0.13:2380" \
--initial-cluster-token=etcd-cluster \
--initial-advertise-peer-urls=https://192.168.0.12:2380 \
--data-dir=/var/lib/etcd/default.etcd

ETCDCTL_API=3 /opt/etcd/bin/etcdctl snapshot restore snap.db \
--name etcd-3 \
--initial-cluster="etcd-1=https://192.168.0.11:2380,etcd2=https://192.168.0.12:2380,etcd-3=https://192.168.0.13:2380" \
--initial-cluster-token=etcd-cluster \
--initial-advertise-peer-urls=https://192.168.0.13:2380 \
--data-dir=/var/lib/etcd/default.etcd

3、启动kube-apiserver和etcd

#所有master节点操作
systemctl start kube-apiserver
#所有etcd节点操作
systemctl start etcd

Kubelet 证书自动续签

K8s证书一般分为两套:K8s组件(apiserver)和Etcd

假如按角色来分,证书分为管理节点和工作节点。

  • 管理节点:如果是kubeadm部署则自动生成,如果是二进制部署一般由cfssl或者openssl生成。

  • 工作节点:工作节点主要是指kubelet连接apiserver所需的客户端证书,这个证书由controller-manager组件自动颁发,默认 是一年,如果到期,kubelet将无法使用过期的证书连接apiserver,从而导致无法正常工作,日志会给出证书过期错误(x509: certificate has expired or is not yet valid)

管理节点:

  • kube-apiserver (本地访问apiserver:127.0.0.1:8080 远端访问apiserver:IP:6443)

  • controller-manager (可单独部署到其他机器)

  • scheduler (可单独部署到其他机器)

工作节点:

  • kubelet

  • kube-proxy

#查看证书有效期

kubeadm alpha certs check-expiration

kubeadm:

管理节点:kubeadm alpha certs renew 或者升级k8s版本 kubeadm upgrade

https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/

工作节点:

1、配置kube-controller-manager组件

#vim /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

3、测试

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

cd /var/lib/kubelet/pki/
openssl x509 -in kubelet-client-current.pem -noout -dates

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

date -s "2022-2-1"
systemctl restart kubelet.service

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

openssl x509 -in kubelet-client-current.pem -noout -dates 

二进制:

管理节点:证书自管理

工作节点:

找一台节点查看:

# 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
# openssl x509 -in /opt/kubernetes/ssl/ca.pem -noout -dates

配置了默认是5年,所以在5年之前不会出现证书过期的问题

Kubernetes 集群常见故障排查思路

先区分部署方式:

1、kubeadm 除kubelet外,其他组件均采用静态Pod启动

2、二进制 所有组件均采用systemd管理

集群部署类问题:

  • 网络不通

  • 启动失败,一般配置文件或者依赖服务

  • 平台不兼容

应用部署类问题:

  • 查看资源详情:kubectl describe TYPE/NAME

  • 查看容器日志:kubectl logs TYPE/NAME [-c CONTAINER]

  • 进入容器中:kubectl exec POD [-c CONTAINER] – COMMAND [args…]

网络类问题,一般指无法在集群内部或者外部访问应用:

  • Pod正常工作吗?

  • Service是否关联Pod?

  • Service指定target-port端口是否正确?

  • 如果用名称访问,DNS是否正常工作?

  • kube-proxy正常工作吗?是否正常写iptables规则?

  • CNI网络插件是否正常工作?