部署k8s-1.20

部署k8s

1. 部署前置条件

1.1 服务器需要root权限

1.2 刷新yum

yum clean all && yum makecache
yum update

1.3 配置k8s的挂载

  • 开始分区磁盘vdb:
fdisk /dev/sdb
n
p
enter
enter 
enter
t
83
w
mkdir /k8s
mkfs.ext4 /dev/sdb1
mount /dev/sdb1 /k8s
vim /etc/fstab
/dev/sdb1 /k8s ext4 defaults 0 0
partprobe
  • 创建需要挂载的路径
mkdir -pv /var/lib/docker
mkdir -pv /var/lib/etcd
mkdir -pv /var/lib/kubelet
mkdir -pv /var/log/pods
mkdir -pv /var/log/containers
mkdir -pv /k8s/lib/docker
mkdir -pv /k8s/lib/etcd
mkdir -pv /k8s/lib/kubelet
mkdir -pv /k8s/log/pods
mkdir -pv /k8s/log/containers
mount --bind /k8s/lib/docker /var/lib/docker
mount --bind /k8s/lib/etcd /var/lib/etcd
mount --bind /k8s/lib/kubelet /var/lib/kubelet
mount --bind /k8s/log/pods /var/log/pods
mount --bind /k8s/log/containers /var/log/containers
  • 把挂载信息写入到开机自启中
vi /etc/fstab
/k8s/lib/docker /var/lib/docker none defaults,bind 0 0
/k8s/lib/etcd /var/lib/etcd none defaults,bind 0 0
/k8s/lib/kubelet /var/lib/kubelet none defaults,bind 0 0
/k8s/log/pods /var/log/pods none defaults,bind 0 0
/k8s/log/containers /var/log/containers none defaults,bind 0 0

1.4 配置k8s的yum源

mkdir -p [k8s目标路径]
# 解压yum源的包到路径下

1.5 关闭防火墙

systemctl stop firewalld && systemctl disable firewalld

#关于防火墙的原因(nftables后端兼容性问题,产生重复的防火墙规则)
#关于selinux的原因(关闭selinux以允许容器访问宿主机的文件系统)
#selinux,这个是用来加强安全性的一个组件,但非常容易出错且难以定位。k8s不支持selinux,默认关闭

1.6 重置iptables

$ iptables -L  
# 查看iptables规则
$ iptables -F    
# 通过iptable分发集群请求,谨慎操作,提前排查

1.7 关闭内核

$ setenforce 0 && sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
---or 
$ sed -i 's/enforcing/disabled/' /etc/selinux/config && setenforce 0 && getenforce

1.8 禁用Swap

$ swapoff -a && sed -i 's/.*swap.*/#&/' /etc/fstab
$ swapoff -a 
# 关闭交换空间
$ vi /etc/fstab  
# 查看是否注释,通过注释来固化关闭swap


<!--
1.8版本之后默认都是关闭的,swap不确定性太高,影响整体的集群稳定和性能,开启swap之后kubelet启动失败SWAP就不太一样了,SWAP是让你在明确的OOM和没有报错但是莫名其妙服务就不能用了之间二选一,对于集群化的服务(比如etcd)来说是挂掉一个实例和整个集群都出毛病之间二选一,一般正常人都知道该选哪个
-->

1.9 修改主机名

hostnamectl set-hostname <hostname>
# 这个看实际的情况

1.9.1 同步时间

yum install -y chrony
systemctl enable chronyd
systemctl start chronyd
timedatectl set-ntp true

1.9.2 调整内核参数

# 按照实际情况操作
cat <<EOF | sudo tee -a /etc/sysctl.conf
vm.max_map_count = 262144
fs.may_detach_mounts = 1
net.ipv4.ip_forward = 1
vm.swappiness=1
kernel.pid_max =1000000
fs.inotify.max_user_instances=524288
EOF
sudo sysctl -p
  • 调整系统限制 根据实际情况配置
$ vi /etc/security/limits.conf
*                soft    nofile         1024000
*                hard    nofile         1024000
*                soft    memlock        unlimited
*                hard    memlock        unlimited
  • 配置hosts
  • 允许 iptables 检查桥接流量 需要通过iptable转发,如果有白名单需要配置白名单
  • 加载br_netfilter模块
$ modprobe  br_netfilter
<!--k8s/etc/sysctl.d/k8s.conf-->
tee /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
sysctl -p /etc/sysctl.d/k8s.conf

1.9.3 查看内核模块是否加载

# <!--如果没有加载,在Master跟所有的Node节点执行如下操作进行加载-->
lsmod | grep ip_vs

1.9.4 加载内核模块开启ipvs

yum install ipset ipvsadm -y
cat > /etc/sysconfig/modules/ipvs.modules << EOF
# !/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules
source /etc/sysconfig/modules/ipvs.modules

1.9.5 配置k8s的yum源

# 所有节点
cat > /etc/yum.repos.d/k8s.repo << EOF
[k8s]
name=k8s
baseurl=file:///var/app/kubernetes
gpgcheck=0
enabled=1
EOF

yum clean all && yum makecache

1.9.6 部署nfs

# 所有节点
yum install -y nfs-utils
systemctl enable nfs && systemctl start nfs

1.9.7 安装kubeadm、kubelet、kubectl

# 所有节点安装
yum install kubeadm-1.20.15 kubelet-1.20.15 kubectl-1.20.15 -y

1.9.8 kubelet加入开机自启

# (不加入开机自启初始化时有警告)
systemctl enable kubelet

<!--根据不同的kubernetes版本安装不同的docker -->

yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6

1.9.9 配置docker

# <!--内网环境需要配置 配置docker仓库harbor地址-->
# 所有节点
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "bip": "192.190.0.1/24",
  "mtu": 1400,
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
#"insecure-registries": ["10.184.74.7:9090"]
docker login -u admin -p Harbor12345 10.184.74.7:9090

1.9.10 设置docker

# 所有节点开机自启与启动
systemctl enable docker && systemctl start docker

1.9.11 删除docker网卡

ip link delete docker0
<!--如果没有做docker存储的挂载,更改docker默认存储-->
systemctl stop docker <!--关闭docker-->
mkdir /data10/k8s/docker -p   <!--创建新的存储路径-->
rsync -avz /var/lib/docker /data10/k8s/docker <!--copy数据到新的路径 rsync与cp用其中一个就行-->
cp -p -r  /var/lib/docker/* /data10/k8s/docker/ <!--copy数据到新的路径-->
vi /etc/docker/daemon.json  <!--添加新的存储路径到docker的配置文件中-->
"data-root": "/k8s/docker/lib"
systemctl daemon-reload && systemctl restart docker <!--保存配置并重启-->
docker info|grep -i root   <!--检查下存储路径-->

1.9.12 kubelet更换存储

 # <!--如果没有错kubelet存储的挂载。更换kubelet的默认存储-->
  systemctl stop kubelet

- 创建kubelet的数据目录

  mkdir -p /k8s/kubelet

- 修改配置文件,增加“--root-dir=vim /etc/sysconfig/kubelet
  KUBELET_EXTRA_ARGS="--root-dir=/home/service/kubelet"

- 修改配置文件(也可以使用sed替换)

  vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
  sed -i 's#/var/lib/kubelet#/data10/k8s/kubelet#g' /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf

- 修改/etc/kubernetes/kubelet.conf的证书路径

  vim /etc/kubernetes/kubelet.conf
  sed -i 's#/var/lib/kubelet#/data10/k8s/kubelet#g' /etc/kubernetes/kubelet.conf

- 拷贝

  cp -p -r /var/lib/kubelet/* /k8s/kubelet/

- 不能删除/var/lib/kubelet

- 重启kubelet
  
  systemctl daemon-reload
  systemctl restart kubelet

- 验证kubelet存储

  mount | grep kubelet

1.9.13 更改etcd存储

# <!--如果没做存储挂载这里需要修改-->
mkdir -pv /k8s/etcd

sed -i 's#/var/lib/etcd#/k8s/etcd#g' /etc/kubernetes/manifests/etcd.yaml

2. 安装kubernetes

2.1 查看kubeadm安装需要需要的镜像

kubeadm config images list

2.2 执行脚本下载镜像 按照实际情况实施

cat k8simages.sh

# !/bin/bash
for i in k8s.gcr.io/kube-apiserver:v1.20.15 k8s.gcr.io/kube-controller-manager:v1.20.15
    k8s.gcr.io/kube-scheduler:v1.20.15 k8s.gcr.io/kube-proxy:v1.20.15 k8s.gcr.io/pause:3.2
    k8s.gcr.io/etcd:3.4.13-0 k8s.gcr.io/coredns:1.7.0; do
   temp=${i#k8s.gcr.io/}
   docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/${temp}
   docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/${temp} k8s.gcr.io/${temp}
   docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/${temp}
done

2.3 初始化集群 master操作

kubeadm init \
--apiserver-advertise-address=192.168.131.128 \    <!--master的ip-->
--kubernetes-version v1.20.15 \
--service-cidr=10.96.0.0/12 \       <!--service的ip地址段-->
--pod-network-cidr=10.244.0.0/16 \     <!--flannel等网络插件的地址段要相同-->
--service-dns-domain=cluster.local \
--upload-certs

# --image-repository 172.17.11.91:6660/kubesphere-simple

# --image-repository 10.184.74.7:9090/k8s

<!--指定镜像下载源(由于我提前下载好了镜像就不需要指定,默认就行,如果没有指定,此项一定要加上。)-->
<!----image-repository registry.cn-hangzhou.aliyuncs.com/google_containers-->
<!--镜像本地报错所以不需要指定镜像-->

2.4 添加node节点

# <!--样例-->
kubeadm join 10.184.74.8:6443 --token 95uoqp.13qhj8b7mjm2i4xt \
    --discovery-token-ca-cert-hash sha256:13134742df2edf2d90852dd90a4c157352aaac7f7988d70ac2b8bc350d1bba72

2.5 复制kubernetes的配置文件

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl taint nodes --all node-role.kubernetes.io/master-    #允许master进行调度业务pod

2.6 修改配置文件

# <!--kubectl get cs scheduer和controller-manager组件状态为Unhealthy,
# 因为默认这两个组件初始化的端口都为0,需要修改,将配置文件中port=0注释掉-->

vi /etc/kubernetes/manifests/kube-controller-manager.yaml
<!-注释--> #- --port=0 
vi /etc/kubernetes/manifests/kube-scheduler.yaml
<!-注释--> #- --port=0
vi /etc/kubernetes/manifests/kube-apiserver.yaml
<!--添加下面2行参数-->
- --feature-gates=RemoveSelfLink=false
- --service-node-port-range=1-65535

2.7 重启kubelet服务

systemctl restart kubelet

2.8 配置coreDns

kubectl edit cm coredns -n kube-system
<!--删除-->
forward . /etc/resolv.conf {
           max_concurrent 1000
        }

2.9 部署kubectl命令自动补全

yum install -y bash-completion
echo "source /usr/share/bash-completion/bash_completion" >> ~/.bashrc
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc

2.9.1部署网络插件calico

# <!--注意配置CALICO_IPV4POOL_CIDR要与kubeadm配置的pod-network-cidr一致-->
kubectl apply -f calico.yaml
  • 配置默认存储 主节点配置

    • 创建存储文件
    mkdir -p /k8s/nfs    <!--主节点节点需要操作-->
    
    vi /etc/exports
    /k8s/nfs *(rw,no_root_squash)   <!--设置挂载路径-->
    exportfs -rv   <!--刷新配置-->
    <!--根据文档操作在k8s中部署nfs-->
    nfs-client.yaml  <!--修改对应的ip-->  
    
    kubectl create -f nfs-client.yaml
    kubectl create -f nfs-client-sa.yaml
    kubectl create -f nfs-client-class.yaml
    
    <!--根据不同的需求增删网卡 -->
    ip link delete tunl0     --service 可以不清理
    ip link delete kube-ipvs0  --默认不开启ipvs,就没有这个网卡
    
    • 配置默认存储
    kubectl patch storageclass course-nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
    

3. 部署kubesphere

3.1 导入kubesphere镜像

imagePullPolicy: IfNotPresent <!--镜像策略-->

kubectl apply -f kubesphere-installer.yaml
kubectl apply -f cluster-configuration.yaml
<!--卸载kubesphere-->
kubectl delete -f cluster-configuration.yaml
kubectl delete -f kubesphere-installer.yaml


<!--验证kubesphere的安装进度-->
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l 'app in (ks-install, ks-installer)' -o jsonpath='{.items[0].metadata.name}') -f

admin/P@88w0rd

<!--查看server的暴露端口-->
kubectl get svc/ks-console -n kubesphere-system


<!--备注-->
<!--多集群配置:看官方文档-->
<!--部署prometheus:配置自主发现-->
<!--部署cadvisor-->


<!--最好在部署kubesphere之前修改配置文件cluster-configuration.yaml-->
<!--jwtSecret、clusterRole、logging-->

4. kubeadm 添加master

从master节点拷贝pki证书到新节点上
在master上获取信息
kubeadm token create --print-join-command <!--获取添加的命令token-->
kubeadm init phase upload-certs --upload-certs  <!--获取证书的token-->
拼接一个新的添加命令

kubeadm join 10.184.74.8:6443 --token 70ih5z.wpckg7jtpvpzsrv1     --discovery-token-ca-cert-hash sha256:13134742df2edf2d90852dd90a4c157352aaac7f7988d70ac2b8bc350d1bba72 --control-plane --certificate-key 8580a6cb7fd4ed2c9d1c0075bd5eab0d06b414c43f56792597e206b5f15a7aa4

<!--如果报错* The cluster has a stable controlPlaneEndpoint address.-->
在master上运行
kubectl -n kube-system edit cm kubeadm-config
添加参数: controlPlaneEndpoint: <master:6443> 
<!--certificatesDir: /etc/kubernetes/pki参数平级就可以-->

5. 集群优化

<!--集群优化 开启ipvs -->
kubectl edit cm kube-proxy -n=kube-system
修改mode: ipvs
kubectl get pod -n kube-system | grep kube-proxy
kubectl delete <pod>
kubectl logs -n kube-system <pod>

6. 通过kubeadm-config.yml 去部署k8s

<!--初始化kubeadm配置文件 -->
kubeadm config print init-defaults > kubeadm-config.yaml

vim kubeadm-config.yaml
······
localAPIEndpoint:
  advertiseAddress: 192.168.44.20  #指定master节点的IP地址
  bindPort: 6443
······
imageRepository: 192.168.117.132/library  #指定镜像仓库的地址+项目
kubernetesVersion: v1.20.15    #指定kubernetes版本号
networking:
  dnsDomain: cluster.local
  podSubnet: "10.244.0.0/16"    #指定pod网段,10.244.0.0/16用于匹配flannel默认网段
  serviceSubnet: 10.96.0.0/16   #指定service网段
scheduler: {}

# 末尾再添加以下内容

---

apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs         #把默认的kube-proxy调度方式改为ipvs模式

kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log

# --upload-certs 参数可以在后续执行加入节点时自动分发证书文件

<!--查看 kubeadm-init 日志-->
less kubeadm-init.log

<!--kubernetes配置文件目录-->7
ls /etc/kubernetes/

<!--存放ca等证书和密码的目录-->
ls /etc/kubernetes/pki

7. linux系统内核参数调优

net.ipv4.tcp_keepalive_time=600 #此参数表示TCP发送keepalive探测消息的间隔时间(秒)
net.ipv4.tcp_keepalive_intvl=30 #tcp检查间隔时间(keepalive探测包的发送间隔)
net.ipv4.tcp_keepalive_probes=10  #tcp检查次数(如果对方不予应答,探测包的发送次数)
net.ipv6.conf.all.disable_ipv6=1 #禁用IPv6,修为0为启用IPv6
net.ipv6.conf.default.disable_ipv6=1 #禁用IPv6,修为0为启用IPv6
net.ipv6.conf.lo.disable_ipv6=1 #禁用IPv6,修为0为启用IPv6
net.ipv4.neigh.default.gc_stale_time=120 #ARP缓存条目超时
net.ipv4.conf.all.rp_filter=0  #默认为1,系统会严格校验数据包的反向路径,可能导致丢包
net.ipv4.conf.default.rp_filter=0 #不开启源地址校验
net.ipv4.conf.default.arp_announce=2 #始终使用与目的IP地址对应的最佳本地IP地址作为ARP请求的源IP地址
net.ipv4.conf.lo.arp_announce=2 #始终使用与目的IP地址对应的最佳本地IP地址作为ARP请求的源IP地址
net.ipv4.conf.all.arp_announce=2 #始终使用与目的IP地址对应的最佳本地IP地址作为ARP请求的源IP地址
net.ipv4.ip_local_port_range= 45001 65000 # 定义网络连接可用作其源(本地)端口的最小和最大端口的限制,同时适用于TCP和UDP连接。
net.ipv4.ip_forward=1 # 其值为0,说明禁止进行IP转发;如果是1,则说明IP转发功能已经打开。
net.ipv4.tcp_max_tw_buckets=6000 #配置服务器 TIME_WAIT 数量
net.ipv4.tcp_syncookies=1 #此参数应该设置为1,防止SYN Flood
net.ipv4.tcp_synack_retries=2 #表示回应第二个握手包(SYN+ACK包)给客户端IP后,如果收不到第三次握手包(ACK包),进行重试的次数(默认为5)
net.bridge.bridge-nf-call-ip6tables=1 # 是否在ip6tables链中过滤IPv6包
net.bridge.bridge-nf-call-iptables=1 # 二层的网桥在转发包时也会被iptables的FORWARD规则所过滤,这样有时会出现L3层的iptables rules去过滤L2的帧的问题
net.netfilter.nf_conntrack_max=2310720 #连接跟踪表的大小,建议根据内存计算该值CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (x / 32),并满足nf_conntrack_max=4*nf_conntrack_buckets,默认262144
net.ipv6.neigh.default.gc_thresh1=8192
net.ipv6.neigh.default.gc_thresh2=32768
net.ipv6.neigh.default.gc_thresh3=65536

# gc_thresh3 是表大小的绝对限制

# gc_thresh2 设置为等于系统的最大预期邻居条目数的值

# 在这种情况下,gc_thresh3 应该设置为一个比 gc_thresh2 值高的值,例如,比 gc_thresh2 高 25%-50%,将其视为浪涌容量

# gc_thresh1 提高到较大的值;此设置的作用是,如果表包含的条目少于 gc_thresh1,内核将永远不会删除(超时)过时的条目

net.core.netdev_max_backlog=16384 # 每CPU网络设备积压队列长度
net.core.rmem_max = 16777216 # 所有协议类型读写的缓存区大小
net.core.wmem_max = 16777216 # 最大的TCP数据发送窗口大小
net.ipv4.tcp_max_syn_backlog = 8096 # 第一个积压队列长度
net.core.somaxconn = 32768 # 第二个积压队列长度
fs.inotify.max_user_instances=8192 # 表示每一个real user ID可创建的inotify instatnces的数量上限,默认128.
fs.inotify.max_user_watches=524288 # 同一用户同时可以添加的watch数目,默认8192。
fs.file-max=52706963 # 文件描述符的最大值
fs.nr_open=52706963 #设置最大微博号打开数
kernel.pid_max = 4194303 #最大进程数
net.bridge.bridge-nf-call-arptables=1 #是否在arptables的FORWARD中过滤网桥的ARP包
vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.panic_on_oom=0 # 开启 OOM
vm.max_map_count = 262144

8. 升级内核

# <!-- 大规模k8s集群,3.10内核不稳定,需要升级内核-->
uname -r  <!--查看内核版本-->
yum -y install  kernel-lt-5.4.230-1.el7.elrepo.x86_64.rpm kernel-lt-devel-5.4.230-1.el7.elrepo.x86_64.rpm <!--升级内核到5.4-->
sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg <!--查看可用内核-->
grub2-mkconfig -o /boot/grub2/grub.cfg <!--重新创建内核配置-->
vi /etc/default/grub <!--修改使用默认内核-->
<!-- 将 GRUB_DEFAULT 设置为 0,代表  GRUB 初始化页面的第一个内核将作为默认内核-->
<!--再重新整理下内核-->
grub2-mkconfig -o /boot/grub2/grub.cfg
<!--重开机-->
reboot
<!--检查-->
uname -r

<!--
检查k8s整体的pod
检查mount与开机自启
检查k8s与docker存储
检查内核
检查kubesphere暴漏端口
检查ipvs转发
-->

9. 部署prometheus

<!--
pro_cm.yaml   prometheus的配置文件
pro_deploy.yaml   
pro_pvc.yaml   需要安装时间情况去修改
pro_rbac.yaml
pro_svc.yaml
-->
vi pro_pvc.yaml
kubectl apply -f ./*.yaml

10. 部署完成后检查

1. 检查docker0网卡是否存在,查看docker0的ip段是否与业务冲突,选择是否删除或者修改
2. 检查所有的pod是否都正常启动

11 .K8S添加iptables

除了要添加对于的podIp、serverIp、还需要添加本机回环、(localhost或者127.0.0.1)
-i lo -d 127.0.0.1/32 -o lo -s 127.0.0.1/32
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值