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
# 安装完成后检查 /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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下