k8s自动化运维七

112 阅读5分钟

承接上文k8s自动化运维六

搭建完整的k8s集群

k8s集群3个节点

vim /etc/hosts

172.16.0.108 k8s-master
172.16.0.109 k8s-nnode1
172.16.0.110 k8s-nnode2

查看linux版本

cat /etc/redhat-release 

Anolis OS release 8.6
阿里云龙蜥操作系统完全兼容CentOS 8

备注

1步~第8步,所有的节点都要操作

第910步Master节点操作

第11步Node节点操作

如果第91011步操作失败,可以通过 kubeadm reset 命令来清理环境重新安装

1、关闭防火墙

systemctl stop firewalld

2、关闭selinux

setenforce 0

3、关闭swap

  • 永久关闭
vim /etc/fstab

image.png

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

  • 临时关闭

    swapoff -a

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

image.png

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

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system

6、安装docker

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

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

7、k8s yum源配置

vim /etc/yum.repos.d/kubernetes.repo

[kubernetes]

name=Kubernetes Repo

baseurl=https://mirrors.tuna.tsinghua.edu.cn/kubernetes/yum/repos/kubernetes-el7-x86_64/

gpgcheck=0

enabled=1

8、安装k8s

yum -y install kubelet-1.18.5 kubeadm-1.18.5 kubectl-1.18.5 --disableexcludes=kubernetes

# 设置k8s开机启动
systemctl enable kubelet

# 启动k8s后台daemon
systemctl start kubelet

9、部署Kubernetes Master

  • 获取需要的docker镜像名称

    kubeadm config images list
    

image.png

  • 编写脚本下拉镜像

    vim pull_k8s_images.sh
    
    https://gitee.com/pingfanrenbiji/k8s-nginx/blob/master/pull_k8s_images.sh
    

    image.png

  • 执行脚本

    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
    

image.png

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

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

在其他的节点上执行该命令,加入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镜像

    image.png

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

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

image.png

a、把–insecure-port=0修改为:–insecure-port=8080

b、增加或修改-insecure-bind-address=0.0.0.0
  • 重启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就启动来了

    image.png

  • 再查看node状态

image.png
至此,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 \
    --discovery-token-ca-cert-hash sha256:1985dddd2ac9ebef9151504366677ee37d22e6bf4b48b3f103485a1c9f5ff13c
  • 查看启动状态

    kubectl -s http://172.16.0.8:8080 get nodes
    

image.png

  • 至此,k8s集群搭建完毕

    image.png

k8s集群网络不通问题排查

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

image.png

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
    

image.pngimage.png

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

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

  • 先查看下宿主机网卡

    ifconfig
    

image.png

发现宿主机网卡名称是eth33

  • 在calico.yaml 文件添加以下两行,这里配置通配符 :

    - name: IP_AUTODETECTION_METHOD
       value: "interface=eth.*"
    

image.png

  • 重启calico应用

    rm -rf /var/lib/cni
    
    kubectl apply -f calico.yaml
    
    kubectl get pods -n kube-system
    

image.png

  • 查看网络设备的启动状态

    birdcl -s /var/run/calico/bird.ctl show protocols
    

    image.png

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

image.png

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

2个解决方案

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

image.png

通过navicat kill 数据库进程

  • 选择什么类型的数据库

image.png

  • 选择数据库实例

    image.png

  • 选择进程,右键kill

    image.png

如何配置nginx https

image.png

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

  • 但怎么配置域名呢?

image.png

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

yum -y install nginx

systemctl start nginx

vim /etc/nginx/nginx.conf

具体内容:https://gitee.com/pingfanrenbiji/k8s-nginx/blob/master/https

image.png

image.png

  • 如果启动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
    

image.png

  • 给指定node设置标签

    # 给master节点设置key1=nginx标签
    kubectl label nodes galaxy-ecs-01 key1=nginx
    
  • 配置pod yaml

    nodeSelector:
      [label.key]: [label.value]
    

    image.png

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

Warning  FailedScheduling  15s (x3 over 17s)  default-scheduler  0/3 nodes are available: 

1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 2 node(s) didn't match node selector.

需要去除master节点的node-role.kubernetes.io/master污点

kubectl taint node galaxy-ecs-01 node-role.kubernetes.io/master:NoSchedule-
  • 启动pod

image.png

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