kubernete安装

1. 修改主机名

hostnamectl --static set-hostname ${主机名}

2. 参数修改

关闭swap

swapoff -a 
cat /etc/fstab      #永久关闭swap,注释swap行
#/dev/mapper/centos-lv_swap swap                    swap    defaults        0 0

K8s master 和worker节点操作

cat >> /etc/sysctl.conf <<EOF
net.ipv4.ip_forward=1
net.ipv4.ip_forward_use_pmtu=0
vm.max_map_count=262144
net.ipv4.tcp_tw_recycle=0
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6 = 1
net.netfilter.nf_conntrack_max=2310720
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.send_redirects = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.wmem_max = 16777216
net.core.rmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_retries2 = 5 
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 1
EOF

执行生效

modprobe br_netfilter
modprobe ip_conntrack
sysctl -p
#添加开机启动模块
1
2
3
4
5
6
7
8
9
cat >>/etc/rc.sysinit<<EOF
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules ; do
[ -x $file ] && $file
done
EOF
 
echo "modprobe br_netfilter" >/etc/sysconfig/modules/br_netfilter.modules
echo "modprobe ip_conntrack" >/etc/sysconfig/modules/ip_conntrack.modules

  



修改配置文件

cat >> /etc/security/limits.conf <<EOF
* soft nofile 655350
* hard nofile 655350
* soft nproc 655350
* hard nproc 655350
EOF

修改打开文件数

sed -i 's/4096/655350/g' /etc/security/limits.d/20-nproc.conf

关闭防火墙和selinux

  setenforce 0
  sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config

  升级系统内核
CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定
# 安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装 一次! 
yum --enablerepo=elrepo-kernel install -y kernel-lt 
# 设置开机从新内核启动 
grub2-set-default 'CentOS Linux (5.4.144-1.el7.elrepo.x86_64) 7 (Core)'
cat /proc/version

3. 安装基础服务

清除缓存

yum clean all && yum makecache

以上步骤,本地yum 源就部署完成

3.1 安装基础服务

yum install  -y   telnet lrzsz wget curl net-tools unzip vim lsof tree fio iperf ntp*  tcpdump make cmake cmake3 gcc gcc-c++ zlib zlib-devel libxslt libxslt-devel libxml2 libxml2-devel openssl openssl-devel
yum update polkit -y

制作时间服务, 只需要一个节点时间服务的server即可, 其他节点同步该节点. 如果云环境中本身已经做了时间同步, 这一步就不需要安装

cat /etc/ntp.conf

配置下游服务器可以使用该服务的IP网段

(192.168.1.0-192.168.1.255)
restrict 192.168.1.0 mask 255.255.255.0 nomodify

外部时间服务器不可用时,以本地时间作为时间服务

server 127.127.1.0  prefer #local clock
fudge  127.127.1.0   stratum  3

启动ntp服务

systemctl start ntpd

检测ntp服务

检测完毕后, 其他服务器需要先关闭ntp服务
systemctl stop ntpd
在crontabl 中添加同步时间
检测完毕后, 其他服务器需要先关闭ntp服务
systemctl stop ntpd
在crontabl 中添加同步时间
* * * * * /usr/sbin/ntpdate 192.168.1.1

4. 安装k8s组件

4.1 网络规划

svc网段	172.16.0.0/16
pod网段	172.31.0.0/16

注意: svc 网段 pod与现有网段不能冲突
例如: 当前服务器的网段是192.168.x.x 网段 建议使用172.16.x.x 这样的

4.2 安装docker

有公网环境部署

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

安装指定版本,19.03.6版本

yum install -y docker-ce-19.03.6

内网环境部署

yum install docker* -y

注意以上步骤是因为已经执行基础包的安装, 很多依赖已经安装才可行.否则会出现依赖错误

修改docker配置

1.24以上版本去掉"storage-opts": ["overlay2.override_kernel_check=true"]

sudo mkdir -p /data/docker/
sudo mkdir -p /etc/docker/
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
  "max-size": "200m",
  "max-file": "10"
  },
  "data-root": "/data/docker",
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF

sudo chown root.root /etc/docker/daemon.json
sudo systemctl enable docker
sudo systemctl start docker 
sudo systemctl status docker

4.3 部署k8s组件

如果服务器可以通公网, 那可以使用阿里云源

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

离线安装如下
在k8s集群所有节点

sudo yum -y install kubeadm-1.18.16 kubectl-1.18.16 kubelet-1.18.16
sudo systemctl enable kubelet

将各个端口加入firewalld

179 calico bgp port, 2379/2380 etcd port, 6443 apiserver port, 10250 kubelet port, 8472 vxlan port, udp 4789 calico port, 112 arp 广播

master

firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10251/tcp
firewall-cmd --permanent --add-port=10252/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --permanent --add-port=53/udp
firewall-cmd --permanent --add-port=53/tcp
firewall-cmd --permanent --add-port=9153/tcp
firewall-cmd --add-masquerade --permanent
firewall-cmd --permanent --add-port=30000-32767/tcp

slave

firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --permanent --add-port=30000-32767/tcp
firewall-cmd --permanent --add-port=53/udp
firewall-cmd --permanent --add-port=53/tcp
firewall-cmd --permanent --add-port=9153/tcp
firewall-cmd --add-masquerade --permanent

istio

firewall-cmd --permanent --add-port=15010-15014/tcp

firewall-cmd --reload

5. 集群初始化

5.1单节点部署初始化

单节点初始化集群, 在k8s-master上执行

kubeadm init --kubernetes-version=v1.18.16 --pod-network-cidr=172.31.0.0/16 --service-cidr=172.16.0.0/16

记住下图标红的, 用于node节点加入集群

kubeadm join 192.168.10.11:6443 --token 1gic6i.t9skvueaamqcdwbx \ --discovery-token-ca-cert-hash sha256:5f48a2053c63930aff30c06b440275436e56c8e9a6a6ef9b7986dcfbd8a3a36e

5.2 高可用集群初始化

使用haproxy+keepalive, 使用单独的两个节点部署
注: 这一步是为了负载三个master节点6443端口, 如果项目业务环境提供负载均衡功能, 可以不必部署keepalived+haproxy, 向客户方申请负载均衡三台master, 并开通6443端口即可

安装keepalive 和haproxy在两个单独的节点, 在这两个节点也需要加firewalld策略

yum install haproxy  keepalived -y
 
sudo systemctl enable keepalived
sudo systemctl enable haproxy
sudo firewall-cmd --permanent --add-port=6443/tcp --add-port=112/tcp 
sudo firewall-cmd --reload

修改haproxy配置

cat > /etc/haproxy/haproxy.cfg<<EOF
global
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

listen stats :25002
    balance
    mode http
    stats enable
    stats auth username:password

listen kube-apiserver :6443
    mode tcp
    option tcplog
    balance source
    #修改一下几个ip为master节点地址
    server master01 192.168.0.111:6443 check
    server master02 192.168.0.112:6443 check
    server master03 192.168.0.113:6443 check
EOF

keepalive配置, 注意两个节点priority 值得变化, 主节点要比从节点大50以上

cat /etc/keepalived/keepalived.conf
global_defs {
    router_id lb01    #router id
} 
vrrp_instance control-plane {
    state MASTER
    interface eth0 
    virtual_router_id 150
    priority 200       
    advert_int 5
    unicast_src_ip 192.168.0.243 #本机ip
    unicast_peer {
       192.168.0.242    #对端ip
    }  
    authentication {
        auth_type PASS
        auth_pass L@Qazx01
    }
    #执行检查脚本
    track_script {
        check_haproxy
   }
    virtual_ipaddress {
        10.10.10.11   #vip
    }
}
cat check_haproxy.sh 
#!/bin/bash
A=`ps -C haproxy --no-header | wc -l`
if [ $A -eq 0 ];then
  systemctl start haproxy 

sleep 3

if [ `ps -C haproxy --no-header | wc -l ` -eq 0 ];then
   systemctl stop keepalived
 fi
fi

添加执行权限,移动到keepalived目录下

sudo chmod +x check_haproxy
sudo mv check_haproxy /etc/keepalived/

启动keepalive服务

sudo systemctl start haproxy
sudo systemctl start keepalived

查看keepalive状态

sudo systemctl status keepalived

在master 和backup节点检查vip是否按照预期存在于master节点上

可以使用ip a 命令查看

初始化集群, 我这里是在master01上进行初始化

在其他master节点加入集群前, 先测试是否初始化成功, 测试vip:6443端口

sudo curl -k -v https://10.10.10.11:6443

10.10.10.11为vip

kubeadm init --kubernetes-version=v1.18.16 --service-cidr=172.16.0.0/16 --pod-network-cidr=172.31.0.0/16 --upload-certs --token-ttl=36h0m0s --control-plane-endpoint=10.10.10.11

初始化成功后, 会出现如下命令, 这两条命令分别是将其他master和node节点加入的命令

master01 初始化成功后 再master02 master03 节点执行加入集群命令

6. 安装网络组件

此时可以在master节点上查看node节点, 但是状态都还是NotReady, 因为还没有安装网络组件. 我这里使用网络组件caclio, 可以使用如下命令获取yaml文件, 由于镜像不好下载, 我这里本地已经提前下载

curl -O https://docs.projectcalico.org/manifests/calico.yaml

calico默认的网卡寻找网卡时eth, 根据自己的实际情况修改yaml文件. 有的环境可能不支持ipip模式, 需要修改为vxlan模式

vxlan模式把如下两行参数注释

- -bird-live
...
...
- -bird-ready

参数calico_backend: "bird" 修改为 calico_backend: "vxlan"

将IPIP修改为Never, VXLAN修改为Always, 172.31.0.0/16网段

- name: CALICO_IPV4POOL_IPIP
  value: "Never"
- name: CALICO_IPV4POOL_VXLAN
  value: "Always"
- name: CALICO_IPV4POOL_CIDR
  value: "172.31.0.0/16"

kubectl apply -f calico.yaml

有的环境中为多网卡或节点之间的网卡名称不统一, 需要修改calico.yaml文件

# Specify interface
            - name: IP_AUTODETECTION_METHOD
              value: "interface=eth0"
              
## 或者ip192.168.1.2可达性选择网卡
            - name: IP_AUTODETECTION_METHOD
              value: "can-reach=192.168.1.2"

7. kube-proxy转发修改为ipvs

查看内核模块是否加载
lsmod|grep ip_vs

如果没有加载,使用如下命令加载ipvs相关模块

modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

更改kube-proxy配置
kubectl edit configmap kube-proxy -n kube-system

找到如下部分的内容

   minSyncPeriod: 0s
      scheduler: ""
      syncPeriod: 30s
    kind: KubeProxyConfiguration
    metricsBindAddress: 127.0.0.1:10249
    mode: "ipvs"                          # 修改为ipvs
nodePortAddresses: null

其中mode默认为空,为iptables模式,改为ipvs scheduler默认是空,默认负载均衡算法为轮训

删除所有kube-proxy的pod
kubectl delete pod `kubectl get -n kube-system | grep kube-proxy| awk '{print $1}'` -n kube-system
使用ipvsadm查看ipvs相关规则,如果没有这个命令可以直接yum安装
yum install -y ipvsadm

posted @   liuxiaobei556  阅读(235)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示