coredns部署和etcd数据备份和恢复

枕上诗书闲处好,门前风景雨来佳。这篇文章主要讲述coredns部署和etcd数据备份和恢复相关的知识,希望能为你提供帮助。
一 coredns部署1 coredns.yaml文件获取
coredns.io官网
github上下载二进制
??https://github.com/coredns/coredns??
??https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns/coredns??#也可以在这个连接执行下载corednsyaml文件
2 coredns.yaml文件配置
2.1 设置要解析的域名
解析的域名必须要和你k8s安装时配置的域名一直,查看方式 /etc/kubeasz/clusters/k8s-cluster01/hosts
2.2 设置dns转发
两种配置方式如图所示:

2.3 资源限制
是否要设置资源限制,根据服务器实际情况来定
limits 表示必须要有这么多资源,pod才可以启动。request表示最高限制这些资源

2.4设置dns地址,cluster_ip
集群里默认.2的地址都是分配给了dns,.1的地址分配给了kubernetes

2.5 镜像地址更改
默认是谷歌地址,去hub上去找coredns下载地址

2.6 域名缓存时间设置

2.7 确定副本数量
默认是1个

2.8 如何让pod的dns地址默认就是coredns的地址
2.8.1在node节点修改/var/lib/kubelet/config.yaml如下图所示:

2.8.2 重启kubelet
2.8.3 删除pod重新生成
全部更改完毕之后就可以部署了

kubectl apply -f coredns.yaml

部署完成之后,去Pod里测试解析域名。如果不能解析去pod的reslov.conf检查你的dns地址
2.9 测试解析域名
kubectl run test1 --image=busybox sleep 30000
进去容器kubectl exec -it test1 sh
ping kube-dns.kube-system.svc.magedu.local#ping 内网域名


外网域名

3.0 查看coredns日志
kubectl logs coredns-7db6b45f67-qklhh -n kube-system -f

二部署dashboard1 获取yaml文件
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml

2更改yaml文件
默认不支持外部访问,需要设置nodeport

3 创建访问用户
kubectl apply -f admin-user.yaml

[root@k8s-master1 yaml]# cat admin-user.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard

4 查看用户的token
kubectl get secret-n kubernetes-dashboard
kubectl describe secret admin-user-token-ckw5q -n kubernetes-dashboard #查看admin的token

5 用token登录

三 k8s内部dns解析流程
在 Kubernetes 中,比如服务 a 访问服务 b,对于同一个 Namespace下,可以直接在 pod 中,通过 curl b 来访问(前提必须有自己的services,也就是clusterip)。对于跨 Namespace 的情况,服务名后边对应 Namespace即可。比如 curl b.default


比如:我在default空间下的pod去分别ping kubernetes和kube-dns
第一个可以直接ping,不需要加命名空间,因为在同一个namespace下

第二个需要加namespace

四 etcd的操作1查看成员信息
etcdctl member list
后面显示的false就是显示没有在同步数据

2 查看集群监控信息
#!/bin/bash
export node_ips="172.31.7.101"

for ip in $node_ips; do
/opt/kube/bin/etcdctl --endpoints=https://$ip:2379 --cacert=/etc/kubernetes/ssl/ca.pem\\
--cert=/etc/kubernetes/ssl/etcd.pem --key=/etc/kubernetes/ssl/etcd-key.pem endpoint health
done

结果如下:

3以表格方式详细显示节点信息
#!/bin/bash
export node_ips="172.31.7.101"

for ip in $node_ips; do
/opt/kube/bin/etcdctl --write-out=table endpoint status --endpoints=https://$ip:2379 --cacert=/etc/kubernetes/ssl/ca.pem\\
--cert=/etc/kubernetes/ssl/etcd.pem --key=/etc/kubernetes/ssl/etcd-key.pem endpoint health
done

【coredns部署和etcd数据备份和恢复】
4 查看etcd数据信息
etcdctl get / --prefix --keys-only#以路径方式显示所有key信息
etcdctl get / --prefix --keys-only |grep pod#显示所有pod信息
etcdctl get / --prefix --keys-only |grep namespaces #显示所有命名空间信息
etcdctl get / --prefix --keys-only |grep deployment #查看deploynent信息
# etcdctl get / --prefix --keys-only |grep calico #显示网络组件

5 etcd的增删改查
[root@k8s-etcd01 ~]# etcdctl put /name "zhang"#添加数据
OK
[root@k8s-etcd01 ~]# etcdctl get /name#查询数据
/name
zhang
[root@k8s-etcd01 ~]# etcdctl put /name "bob" #更改数据
OK
[root@k8s-etcd01 ~]# etcdctl get /name
/name
bob
[root@k8s-etcd01 ~]# etcdctl del /name#删除数据
1

6etcd weach机制
etcdctl watch /data#在一个终端检测

然后在另一个终端添加数据
[root@k8s-etcd01 ~]# etcdctl put /data "456"
OK
[root@k8s-etcd01 ~]# etcdctl put /data "123"


五 etcd的备份和恢复etcd是只支持全量备份,所以恢复的时候也只能全量恢复,所以在实际环境中通常会采用velero 去针对命名空间去备份。
velero 使用方法见:
1 v3版本的 备份和恢复
备份:
etcdctl snapshot save snapshot.db


恢复
etcdctl snapshot restore snapshot.db --data-dir=/opt/etcd-test#恢复的目录必须是一个不存在的目录,会自动创建

然后把etcd的datedir和workdir目录都改一下,改成/opt/etcd-test,然后重启etcd即可。
2脚本自动备份
需要借助crontab
#!/bin/bash
source /etc/profile
DATE=`date +%Y-%m-%d_%H-%M-%S`
etcdctl snapshot save /data/etcd-backup/etcd-snapshot-$DATE.db

3借助kubeasz 去备份etcd数据
这个是直接备份整个集群的
./ezctl backup k8s-cluster01# 备份集群
./ezctl restore k8s-cluster01#恢复集群

4 etcd添加和删除节点
./ezctl add-etcdip
./ezctl del-etcd ip

5 etcd数据恢复流程
当etcd集群宕机数量超过总结点数一半以上(如总数为3台,宕机2台),则需要重新恢复数据,流程如下:
1 恢复服务器系统
2 重新部署etcd集群
3 停止kube-apiserver/controller-manager/scheduler/kubelet/kube-proxy
4 停止etcd集群
5 各个etcd节点恢复同一份备份数据
6 启动各节点并验证etcd集群
7启动kube-apiserver/controller-manager/scheduler/kubelet/kube-proxy
8 验证k8s master 状态以及pod数据

6 etcd碎片整理
/usr/local/bin/etcdctl defrag --cluster--endpoints=https://172.31.7.106:2379--cacert=/etc/kubernetes/ssl/ca.pem--cert=/etc/kubernetes/ssl/etcd.pem--key=/etc/kubernetes/ssl/etcd-key.pem

六 k8s集群的升级1 先下载新版本的二进制文件
??https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.23.md#server-binaries??
下载如下两个

2升级master
需要先在负载均衡里先剔除出去master配置在/etc/kube-lb/conf目录,然后重启kube-lb服务
流程如下:
1 先停止服务
systemctlstop kube-apiserver.service kube-controller-manager.servicekube-scheduler.servicekube-proxy.service kubelet.service

2 拷贝新版本的命令到指定目录
/usr/local/src/kubernetes/server/bin
# 强制替换反斜杠
\\cpkube-apiserver kube-controller-managerkube-scheduler kubelet kube-proxy kubectl /opt/kube/bin/
替换完之后,在启动这些服务
systemctlstart kube-apiserver.service kube-controller-manager.servicekube-scheduler.servicekube-proxy.service kubelet.service

3 升级node
1 强制驱逐指定节点
# kubectldrain 172.31.7.102 --force --ignore-daemonsets--delete-emptydir-data
2 停止服务 systemctl stopkubelet kube-proxy
3 替换 kubectl kubelet kube-proxy
4 启动systemctl startkubelet kube-proxy
5 取消驱逐 kubectl uncordon 172.31.7.102

升级结果:

七 k8s集群管理-借助kubeasz支持的功能如下:
add-etcd< cluster> < ip> to add a etcd-node to the etcd cluster
add-master< cluster> < ip> to add a master node to the k8s cluster
add-node< cluster> < ip> to add a work node to the k8s cluster
del-etcd< cluster> < ip> to delete a etcd-node from the etcd cluster
del-master< cluster> < ip> to delete a master node from the k8s cluster
del-node< cluster> < ip> to delete a work node from the k8s cluster

举例:
1添加node节点
./ezctl add-node k8s-cluster01 172.31.7.113#node节点ip

2 添加master节点
./ezctl add-master k8s-cluster01 172.31.7.110#master节点ip

3 删除node节点
./ezctl del-node k8s-cluster01 172.31.7.113

八 yaml文件字段解释
[root@k8s-master1 yaml]# cat nginx.yaml
kind: Deployment #类型,是deployment控制器
#apiVersion: extensions/v1beta1
apiVersion: apps/v1 # api版本
metadata: #pod元数据
labels: #自定义pod的标签
app: linux66-nginx-deployment-label #标签名称为app,值为linux66-nginx-deployment-label 是deployment的标签
name: linux66-nginx-deployment # pod的名字
namespace: linux66 # pod命名空间
spec:# 定义deployment中容器的详细信息
replicas: 1 # 副本数量,pod的数量
selector: # 定义标签选择器
matchLabels: #定义匹配的标签 ,必须要设置
app: linux66-nginx-selector #匹配的目标标签
template: #模板,必须定义,起到描述要创建pod的作用
metadata: #定义模板元数据
labels: # 定义模板label
app: linux66-nginx-selector #定义pod标签
spec: # 定义pod信息
containers: # 定义pod中容器列表,可以多个或者一个
- name: linux66-nginx-container #容器名称
image: nginx #镜像地址
#command: ["/apps/tomcat/bin/run_tomcat.sh"]
#imagePullPolicy: IfNotPresent #如果本地存在,则不拉取镜像
imagePullPolicy: Always # 镜像拉去策略。总是拉取最新的
ports: #定义容器端口列表
- containerPort: 80
protocol: TCP
name: http
- containerPort: 443
protocol: TCP
name: https
env: #定义pod 环境变量,可以直接在pod引用
- name: "password"
value: "123456"
- name: "age"
value: "18"
#resources:
#limits: #限制pod最多使用多少资源
#cpu: 1 # 2 整数表示核数=200%,1.5浮点数表示1.5核心=150% ,800m=0.8=80% 1核心=1000m(毫核)
#memory: 1Gi
#requests: #最少要满足这些条件,否则无法启动pod
#cpu: 2
#memory: 2Gi


---
kind: Service #类型为service
apiVersion: v1
metadata:
labels: #自定义标签
app: linux66-nginx-service-label #标签内容
name: linux66-nginx-service # service的名字
namespace: linux66 #service的命名空间,必须和pod在同一个命名空间
spec: #定义serverce的详细信息
type: NodePort #service的类型,默认是clusterIP,
ports: # 定义访问端口
- name: http
port: 80 # service的端口
protocol: TCP
targetPort: 80 #目标pod的端口
nodePort: 30006 #node节点暴露的端口
- name: https
port: 443
protocol: TCP
targetPort: 443
nodePort: 30443
selector:
app: linux66-nginx-sel

    推荐阅读