承接上文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步,所有的节点都要操作
第9、10步Master节点操作
第11步Node节点操作
如果第9、10、11步操作失败,可以通过 kubeadm reset 命令来清理环境重新安装
1、关闭防火墙
systemctl stop firewalld
2、关闭selinux
setenforce 0
3、关闭swap
- 永久关闭
vim /etc/fstab
注释掉/etc/fstab这一行,永久关闭swap分区(k8s运行必须关闭掉swap分区)
-
临时关闭
swapoff -a
4、添加主机名与ip对应关系
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文件驱动,
将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
-
编写脚本下拉镜像
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 \
--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镜像
由于kube-apiserver默认只启动安全访问接口6443,而不启动非安全访问接口8080,kubectl是通过8080端口访问k8s kubelet的,所以要修改配置文件,使其支持8080端口访问:
vim /etc/kubernetes/manifests/kube-apiserver.yaml
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就启动来了
-
再查看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 \
--discovery-token-ca-cert-hash sha256:1985dddd2ac9ebef9151504366677ee37d22e6bf4b48b3f103485a1c9f5ff13c
-
查看启动状态
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文件:gitee.com/pingfanrenb…](p3-juejin.byteimg.com/tos-cn-i-k3…)
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 nginx
systemctl start nginx
vim /etc/nginx/nginx.conf
具体内容:https://gitee.com/pingfanrenbiji/k8s-nginx/blob/master/https
-
如果启动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:
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
可以看到这个pod被调度到master节点上了