程序员的资源宝库

网站首页 > gitee 正文

k8s 集群安装(k8s 集群安装后断网)

sanyeah 2024-04-03 18:40:00 gitee 4 ℃ 0 评论

k8s 集群安装

1.1 安装前准备

1.1.1 网络拓扑及准备

我们提前安装好了ikuai路由器用于网络转发及网络控制

  • 安装单网卡机器,如果不是单网卡,在初始化k8s前先关闭其他网卡,初始化完以后再打开
  • k8s节点cpu必须大于2核心,内存3G以上 存储空间100G以上,去掉swap分区,因为容器会创建在swap分区影响pod,官方建议关闭,boot建议800M,因为后面可能升级内核
  • selinux 关闭,firewalld关闭,iptables可以打开,但是规则为空,k8s部署好后再添加规则,如果有两块网卡,不能配置两个网关

网络拓扑大概是下面这样的

k8s集群都是仅主机模式,通过ikuai路由器与外界通信

1.1.2 机器网卡配置

我们这里准备了四台机器,
一台ikuai路由器: 192.168.50.120
三台Centos7均为仅主机模式的机器,dns和网关都设置成 192.168.50.120:
master1 192.168.50.121
node1 192.168.50.122
node2 192.168.50.123

网卡配置参考:

TYPE=Ethernet
BOOTROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.50.121
NETMASK=255.255.255.0
GATEWAY=192.168.50.120
DNS1=192.168.50.120
DNS2=8.8.8.8

修改完网卡后重启网卡,再在仅主机模式的master节点 192.168.50.120 上测试,可以发现仅主机模式,不能连上外网的机器可以通过ikuai路由器访问外网了

1.1.3 修改主机名

分别修改三台centos7的主机名,否则k8s注册的时候可能会因为主机名称相同报错

systemctl set-hostname master1
systemctl set-hostname node1
systemctl set-hostname node2

修改/etc/hosts文件
这里的m1,n1,n2是别名,也可以不写

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.50.121	master1 m1
192.168.50.122  node1   n1
192.168.50.123  node2   n2

修改完后,拷贝这个文件给其他机器

scp /etc/hosts root@192.168.50.122:/etc/hosts
scp /etc/hosts root@192.168.50.123:/etc/hosts

1.1.4 安装依赖包

在xshell这里可以设置当前窗口全部执行一个命令,避免同一命令重复粘贴操作

yum -y  install conntrack ntpdate ntp ipvsadm ipset iptables-services curl sysstat libseccomp wget vim net-tools git

1.1.5 关闭防火墙及selinux,关闭swap

#开启iptables并清空规则
systemctl restart iptables;
systemctl enable iptables;
iptables -F;
service iptables save
#关闭firewalld
systemctl stop firewalld
systemctl disable firewalld
#关闭selinux
setenforce 0;sed -i "s/enable/disabled/g" /etc/selinux/config
#关闭swap并注意确认 /etc/fstab里面没有swap的配置,有的话就注掉
swapoff -a;

1.1.6 时间同步并设置时区

正常来说都会把master作为时间同步的server,node作为时间同步的client,甚至有的公司会搭建自己的时间服务器进行同步,k8s的节点之间有的是基时间戳来通信的
我们这里跟阿里云的时间进行同步

ntpdate -u ntp1.aliyun.com

这里k8s的node都是把master作为时间服务器去同步时间的,所以我们
在master节点上执行

yum -y install chrony
vim /etc/chrony.conf
#修改配置切换成阿里云的时间服务器
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst
#设置白名单
allow 192.168.50.0/24
#设置权重
local stratum 10

修改后重启chronyd
systemctl restart chronyd
systemctl enable chronyd

在另外两台node节点上执行

vim /etc/chrony.conf
#修改配置
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server 192.168.50.120 iburst

systemctl restart chronyd
systemctl enable chronyd

#时区设置为上海
timedatectl set-timezone Asia/Shanghai
#将当前的UTC时间写入硬件时钟
timedatectl set-local-rtc 0

#重启依赖系统时间的服务
systemctl restart crond
systemctl restart rsyslog

1.1.7 内核参数修改

cat kubernets.conf 
#这里的配置也适用于docker,dockerrun的时候有时候会报错
#在ipv4的网络下,所有经过网桥的流量都必须经过防火墙处理
net.bridge.bridge-nf-call-iptables=1
#在ipv6的网络下,所有经过网桥的流量都必须经过防火墙处理
net.bridge.bridge-nf-call-ip6tables=1
#开启网络转发
net.ipv4.ip_forward=1
#禁止使用swap空间,只有当系统oom的时候才允许使用它
vm.swappiness=0
#不检查物理内存是否够用
vm.overcommit_memory=1
#开启oom
vm.panic_on_oom=0
fs.file-max=52706963
fs.nr_open=52706963
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576

#每次重启都会执行 /etc/sysctl.d/下面的文件
cp kubernets.conf /etc/sysctl.d/
sysctl -p /etc/sysctl.d/kubernets.conf

#下面的两个报错可以先忽略,因为我们现在还没用网桥
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory

1.1.8 关闭不必要的服务

systemctl stop postfix && systemctl disable postfix

1.1.9 设置rsyslogd和systemd journald

centos7有两套日志收集系统,rsyslogd是从centos6过来的,当系统有两套系统日志收集时会对增加磁盘的压力,所以我们这里关闭rsyslogd,使用 journald

#持久化保存日志的目录
mkdir -p /var/log/journal
mkdir -p /etc/systemd/journald.conf.d
vim /etc/systemd/journald.conf.d/99-prophet.conf
[Journal]
#持久化保存到磁盘
Storage=persistent
#压缩历史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
#最大占用空间
SystemMaxUse=10G
#单日志文件最大200M
SystemMaxFileSize=200M
#日志保存时间2周
MaxRetentionSec=2week
#不将日志转发到syslog,这是重点,相当于关闭了rsyslog
ForwardToSyslog=no

systemctl restart systemd-journald

1.1.10 升级内核版本到4.44

红帽公司出的centos和ubuntu相当于汽车,他的内核就是发动机,发动机可以替换
红帽官方系列是不允许我们自己升级内核的,只允许向官方申请更新才允许更新
centos允许自己升级内核,但是没有提供新的内核,我们可以去外网下载内核

centos7.X自带的3.10.x内核存在一些bug,导致运行的Docker和k8s不稳定

#安装el源
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
#指定el源并安装4.44内核版本,kernel-lt即代表4.44
yum --enablerepo=elrepo-kernel install -y kernel-lt

内核安装后注意安装的信息,我们接下来会用到

#注意这里的5.4.194-1.el7.elrepo.x86_64不是随便写的,是上面你安装完后,最后几行中的小版本信息
#设置开机从新内核启动
grub2-set-default 'CentOS Linux (5.4.194-1.el7.elrepo.x86_64) 7 (Core)'

重启完成后执行确认内核是否升级成功

uname -r

1.1.11 开启网桥和防火墙的连接模块

echo "1" > /proc/sys/net/bridge/bridge-nf-call-iptables
modprobe br_netfilter

cat  /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash

2.1 安装k8s

安装k8s现在有很多部署方法,其中常见的有二进制安装和docker安装
现在的rancher和sealos都是基于官方的kubeadm进行的二次开发
docker部署的k8s可以自愈,自己挂了自己还能尝试起来

docker安装的缺点:

  • 镜像安装虽然比二进制安装快捷便利不少,但是他的镜像存在GCR上,即google的镜像仓库,国内无法访问,可以在外网下载好,传到机器上导入镜像初始化
  • 证书有效期是1年,可以用kubeadm源码修改,把1年改称100年

3.1 docker安装k8s

3.1.1 安装docker

yum -y install yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce

#创建 /etc/docker 目录
mkdir -p /etc/docker

cat /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "insecure-registries": ["harbor.hongfu.com"],  #habor私有镜像地址
  "registry-mirrors": ["https://kfp63jaj.mirror.aliyuncs.com"] #阿里云加速器
}

#重启docker
systemctl restart docker

#重启服务器让他加载到防火墙里
reboot

3.1.2 安装kubeadm(主从配置)

cat /etc/yum.repos.d/kubernetes.repo 
[kubernetes]
name=kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

yum -y install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1
systemctl enable kubelet

kubeadm启动流程(master节点):
systemd起来后会引导kubelet,kubelet引导容器组件,这样k8s服务就起来了

3.1.3 初始化主节点

导入k8s组件的镜像,因为镜像在google官网,国内下载下来
镜像放到网盘上了,需要的自取
链接:https://pan.baidu.com/s/1zlRn0RrsjwB2ladI-9_qug
提取码:6a3g

tar zxvf kubeadm-basic.images.tar.gz;cd kubeadm-basic.images
#导入镜像
for i in `ls`;do docker load -i ${i};done

初始化

#执行获得一个初始化k8s的yaml模板
kubeadm config print init-defaults > kubeadm-config.yaml

#模板初始化完是不能直接用的,需要修改下配置
vim kubeadm-config.yaml  
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  #主master的ip
  advertiseAddress: 192.168.50.121    
  #k8s集群访问的端口
  bindPort: 6443 
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  #主master的主机名,这里应该是已经初始化过的
  name: master1    
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
#当前版本,我们导入的是v1.15.1版本
kubernetesVersion: v1.15.1
networking:
  #指定k8s集群内部的域名
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  #这个是添加的,pod网段,这里是固定的
  podSubnet: 10.244.0.0/16
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
  SupportIPVSProxyMode: true
#使用ipvs负载均衡,不能给降级成iptables
mode: ipvs


#上面的模板改完后,我们用kubeadm初始化
kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log

出现下面内容说明初始化成功了

初始化完后,我们的k8s集群后续可能还会加节点升级之类的动作,所以当前目录下的一些文件我们要长时间保留,不能随意被删除,后面会用到

mkdir -p /opt/kubernets;mv ./kubeadm-init.log  kubeadm-config.yaml  -t /opt/kubernets/

做完这个操作,当前目录的文件可以删除没用了

分析k8s初始化日志
cat /opt/kuberbets/kubeadm-init.log
#会帮我们下载kubeadm初始化所需的所有镜像
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
#kubeadm的环境变量
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
#这里我们打开上面这个环境变量
cat /var/lib/kubelet/kubeadm-flags.env
#指定当前cgroup的驱动类型为systemd,指定当前的网络插件是cni,指定pod初始化容器是用哪一个镜像
KUBELET_KUBEADM_ARGS="--cgroup-driver=systemd --network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.1"

#kubectl用到的所有yml文件
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"

#当前k8s的证书,因为k8s是两套cs架构,所以在/etc/kubernetes/pki下面还有个etcd,/etc/kubernetes/pki/etcd下也有个证书
[certs] Using certificateDir folder "/etc/kubernetes/pki"
#api-server可以通过什么途径访问
[certs] apiserver serving cert is signed for DNS names [master1 kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.50.121]
#k8s组件controller,kubelet,admin,scheduler的配置文件路径
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
#这个目录下的所有的yaml文件都会被引导起来,所以后面如果想哪个pod跟着k8s起来可以放到这个目录下
etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"

#kubectl会默认调用 $HOME/.kube/config这个目录下的配置文件,配合文件里有集群的访问地址和凭据,如果没有 $HOME/.kube/config这个文件,kubectl将获取不到k8s集群的信息,只有执行下面三部操作,才能让kubectl正常工作
To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

#让其他主机加入k8s集群的方式 abcdef.0123456789abcdef 是k8s集群随机生成的token, sha256:4a58fef19f1fab847142ea395a65247b1f64a0e4d28a00b9808e6986c679377a是apiserver的token,他俩是双向认证的
kubeadm join 192.168.50.121:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:4a58fef19f1fab847142ea395a65247b1f64a0e4d28a00b9808e6986c679377a 

3.1.4 添加kubectl的配置并添加k8s子节点

我们需要让kubectl获取到k8s集群信息

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

3.1.5 添加子节点只需要把上面的那一段到另外两台机器上执行以下即可

kubeadm join 192.168.50.121:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:4a58fef19f1fab847142ea395a65247b1f64a0e4d28a00b9808e6986c679377a 

这里我们把这两行到另外两台机器上分别执行下,可能会有以下warning信息,但是不影响

3.1.6 创建Flannel网络,这一步每个节点都要操作

#查看现在已经获取到的k8s节点信息,此时到的节点信息都是NotReady状态,因为我们还没创建Flannel网络
kubectl get nodes

创建Flannel网络,这一步每个节点都要操作

yml文件可以从官网下载

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

但是下载镜像需要FQ,我这里把镜像及安装Flannel的yml文件打成包放在网盘上了
链接:https://pan.baidu.com/s/1mP5PdFsI7ZZEhXGvmTrKMQ
提取码:1wni

mkdir -p /opt/kubernets/cni/
cd /opt/kubernets/cni/
#解压下载好的flannel.tar.gz文件
tar zxvf flannel.tar.gz
cd flannel;docker load -i flannel.tar
kubectl apply -f kube-flannel.yml

等待十几秒,再执行 kubectl get nodes可以看到所有的节点变成了 Ready,如果没有变成Ready,可以从官网重新下载个yml重新 apply试试

到这里,k8s已经部署完成了
官方有个默认的命名空间kube-system,k8s所有的组件都在这个kube-system命名空间下

#执行可以看到自己部署的所有组件,看看状态是否正常
kubectl get pod -n kube-system

接下来我们就可以熟悉k8s的功能了,比如先建一个deployment的容器试试

kubectl create deployment myapp --image=wangyanglinux/myapp:1

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表