网络知识 娱乐 k8s自动化运维七

k8s自动化运维七

承接上文k8s自动化运维六

搭建完整的k8s集群

k8s集群3个节点

vim /etc/hostsnn172.16.0.108 k8s-mastern172.16.0.109 k8s-nnode1n172.16.0.110 k8s-nnode2n

查看linux版本

cat /etc/redhat-release nnAnolis OS release 8.6n阿里云龙蜥操作系统完全兼容CentOS 8n

备注

第1步~第8步,所有的节点都要操作nn第9、10步Master节点操作nn第11步Node节点操作nn如果第9、10、11步操作失败,可以通过 kubeadm reset 命令来清理环境重新安装n

1、关闭防火墙

systemctl stop firewalldn

2、关闭selinux

setenforce 0n

3、关闭swap

  • 永久关闭

vim /etc/fstabn

注释掉/etc/fstab这一行,永久关闭swap分区(k8s运行必须关闭掉swap分区)

  • 临时关闭
  • swapoff -a

4、添加主机名与ip对应关系

5、将桥接的IPV4流量传递到iptables 的链

cat > /etc/sysctl.d/k8s.conf << EOFnnet.bridge.bridge-nf-call-ip6tables = 1nnet.bridge.bridge-nf-call-iptables = 1nEOFnnsysctl --systemn

6、安装docker

安装docker的过程,详见快速搭建自动化运维环境,安装好之后,查看docker文件驱动,

将docker文件驱动由默认的cgroupfs 改成 systemd,与k8s保持一致避免冲突

7、k8s yum源配置

vim /etc/yum.repos.d/kubernetes.reponn[kubernetes]nnname=Kubernetes Reponnbaseurl=https://mirrors.tuna.tsinghua.edu.cn/kubernetes/yum/repos/kubernetes-el7-x86_64/nngpgcheck=0nnenabled=1n

8、安装k8s

yum -y install kubelet-1.18.5 kubeadm-1.18.5 kubectl-1.18.5 --disableexcludes=kubernetesnn# 设置k8s开机启动nsystemctl enable kubeletnn# 启动k8s后台daemonnsystemctl start kubeletn

9、部署Kubernetes Master

  • 获取需要的docker镜像名称kubeadm config images list

  • 编写脚本下拉镜像
  • vim pull_k8s_images.sh https://gitee.com/pingfanrenbiji/k8s-nginx/blob/master/pull_k8s_images.sh

  • 执行脚本
  • chmod +x ./pull_k8s_images.sh ./pull_k8s_images.sh
  • 执行初始化操作
  • kubeadm init --kubernetes-version=1.18.5 --apiserver-advertise-address=172.16.0.108 --service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16

执行初始化操作之后,可以看到join命令

kubeadm join 172.16.0.108:6443 --token 4r2xdp.60g3flc392fjvtu4 n --discovery-token-ca-cert-hash sha256:1985dddd2ac9ebef9151504366677ee37d22e6bf4b48b3f103485a1c9f5ff13cn

在其他的节点上执行该命令,加入k8s集群即可。

  • 根据提示执行
  • mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 查看k8s docker镜像

由于kube-apiserver默认只启动安全访问接口6443,而不启动非安全访问接口8080,kubectl是通过8080端口访问k8s kubelet的,所以要修改配置文件,使其支持8080端口访问:

vim /etc/kubernetes/manifests/kube-apiserver.yamln

a、把–insecure-port=0修改为:–insecure-port=8080nnb、增加或修改-insecure-bind-address=0.0.0.0n

  • 重启k8s
  • systemctl restart kubelet
  • 开启内核参数
  • sysctl net.bridge.bridge-nf-call-iptables=1
  • 查看node节点
  • kubectl get node NAME STATUS ROLES AGE VERSION k8s-master NotReady master 11m v1.18.5

10、安装calico网络

  • 下载calico.yaml
  • wget http://docs.projectcalico.org/v3.8/manifests/calico.yaml
  • 安装calico
  • kubectl apply -f calico.yaml
  • 查看是否安装成功
  • 安装好了calico插件之间 coredns就启动来了

  • 再查看node状态


至此,k8s master节点创建完毕。

11、Node节点加入集群(在k8s-nnode1和k8s-nnode2)

  • 在其他node节点上执行join命令

向集群添加新节点,执行在kubeadm init输出的kubeadm join命令。

在k8s-nnode1和k8s-nnode2都执行

kubeadm join 172.16.0.108:6443 --token 4r2xdp.60g3flc392fjvtu4 n --discovery-token-ca-cert-hash sha256:1985dddd2ac9ebef9151504366677ee37d22e6bf4b48b3f103485a1c9f5ff13cn

  • 查看启动状态kubectl -s http://172.16.0.8:8080 get nodes

  • 至此,k8s集群搭建完毕

k8s集群网络不通问题排查

  • 某一个node节点calico插件未启动成功

kubenetes安装calico发现其中一个处于Running,但READY列却显示不正常

  • 进入这个pod内
  • kubectl exec -ti calico-node-6j576 -n kube-system -- bash
  • 查看router id值发现绑定地址异常,必须为宿主机的IP地址
  • cat /etc/calico/confd/config/bird.cfg

当前这个pod所在的宿主机的ip是172.16.0.110,并且配置到172.16.0.108和172.16.0.109的路由关系。

如果ip不是宿主机ip,怎么解决?

  • 先查看下宿主机网卡ifconfig

发现宿主机网卡名称是eth33

  • 在calico.yaml 文件添加以下两行,这里配置通配符 :- name: IP_AUTODETECTION_METHOD value: "interface=eth.*"

  • 重启calico应用rm -rf /var/lib/cni kubectl apply -f calico.yaml kubectl get pods -n kube-system

  • 查看网络设备的启动状态
  • birdcl -s /var/run/calico/bird.ctl show protocols

    • pod与pod之间网络不通,pod与svc之间网络不通,pod访问不了外网

这是因为docker 1.13.0 更改了默认的防火墙规整,FORWARD 改为了 drop,导致被防火墙 drop 了。

2个解决方案

  • 在每个节点上开启网络转发即可 iptables -P FORWARD ACCEPT
  • 通过 docker.service 或者 /etc/docker/daemon.json 配置 dockerd 选项 --iptables=false

通过navicat kill 数据库进程

  • 选择什么类型的数据库

  • 选择数据库实例

  • 选择进程,右键kill

如何配置nginx https

  • 通过k8s部署一个nginx(对应的yaml文件:https://gitee.com/pingfanrenbiji/k8s-nginx),并启动一个web服务

  • k8s pod内是一个nginx服务,监控一个9000端口,对应一个web服务

  • k8s service暴露30084端口(k8s默认端口号范围是 30000-32767),转发到pod内的9000端口

启动成功之后,就可以通过http://127.0.0.1:30084访问web服务了

  • 但怎么配置域名呢?

在宿主机上启动一个nginx,暴露80端口,配置https

yum -y install nginxnnsystemctl start nginxnnvim /etc/nginx/nginx.confnn具体内容:https://gitee.com/pingfanrenbiji/k8s-nginx/blob/master/httpsn

  • 如果启动nginx失败,80端口被阿里云盾占用
  • Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use sudo fuser -k 80/tcp

指定pod在某一个node上启动

  • 查看node标签kubectl get nodes --show-labels

  • 给指定node设置标签
  • # 给master节点设置key1=nginx标签 kubectl label nodes galaxy-ecs-01 key1=nginx
  • 配置pod yaml
  • nodeSelector: [label.key]: [label.value]

  • 去除master节点不能被调度的污点

Warning FailedScheduling 15s (x3 over 17s) default-scheduler 0/3 nodes are available: nn1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 2 node(s) didn't match node selector.nn需要去除master节点的node-role.kubernetes.io/master污点nnkubectl taint node galaxy-ecs-01 node-role.kubernetes.io/master:NoSchedule-n

  • 启动pod

可以看到这个pod被调度到master节点上了