云服务器部署k8s集群

2023-09-15 17:28:28

在两台不同厂商的云服务器上部署k8s集群,遇到一些问题。在此进行下总结。

首先要网络能够互通,我是通过添加虚拟网卡的方式

lsmod | grep ip_vs #检查是否有开启
 
#临时开启ip_vs
for i in $(ls /lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i; done
 
#永久开启
ls /lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*" >> /etc/modules
 

CENTOS7 增加虚拟网卡

确认内核是否有tun模块

# modinfo tun

yum install tunctl -y

如果找不到

vim /etc/yum.repos.d/nux-misc.repo

[nux-misc]
name=Nux Misc
baseurl=http://li.nux.ro/download/nux/misc/el7/x86_64/
enabled=0
gpgcheck=1
gpgkey=http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
 

# yum --enablerepo=nux-misc install tunctl

---------------------------------------

tunctl -t tap0 -u root                        

tap0 是虚拟网卡名字

ifconfig tap0 172.168.1.1 netmask 255.255.255.0 promisc

172.168.1.1 是ip地址

查看

ifconfig tap0

然后建立虚拟IP,如果有节点不是公网内网分离则不需要

#ifconfig查看网卡有哪些
#临时建立虚拟网卡,注意如果多个服务器都是公网内网分离,则都需要建立虚拟网卡
ifconfig eth1:0 公网IP netmask 255.255.255.0 up
#删除
ifconfig eth1:0 down
 
#永久建立
vim  /etc/network/interfaces
auto eth1:0  
iface eth1:0 inet static  
name Ethernet alias LAN card  
address 192.168.33.149 
netmask 255.255.255.0  
broadcast 192.168.33.255
 
/etc/init.d/networking restart

#ifconfig查看网卡有哪些
#临时建立虚拟网卡,注意如果多个服务器都是公网内网分离,则都需要建立虚拟网卡
ifconfig eth1:0 公网IP netmask 255.255.255.0 up
#删除
ifconfig eth1:0 down
 
#永久建立
vim  /etc/network/interfaces
auto eth1:0  
iface eth1:0 inet static  
name Ethernet alias LAN card  
address 192.168.33.149 
netmask 255.255.255.0  
broadcast 192.168.33.255
 
/etc/init.d/networking restart

观察参数修改是否生效命令:

sysctl --system

安装docker

安装k8s相关组件

修改kubelet的文件

vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
 
# 注意,这步很重要,如果不做,节点仍然会使用内网IP注册进集群
# 在末尾添加参数 --node-ip=公网IP
 
# Note: This dropin only works with kubeadm and kubelet v1.11+
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/sysconfig/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS --node-ip=公网ip
 

vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
 
# 注意,这步很重要,如果不做,节点仍然会使用内网IP注册进集群
# 在末尾添加参数 --node-ip=公网IP
 
# Note: This dropin only works with kubeadm and kubelet v1.11+
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/sysconfig/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS --node-ip=公网ip

创建master节点

部署dashboard时一直处于Pending状态

kubectl describe pod kubernetes-dashboard-5947dc95db-n42cs -n kubernetes-dashboard

1、node节点的taint(污点)和toleration(容忍)

使用kubeadm初始化的集群,出于安全考虑Pod不会被调度到Master Node上,也就是说Master Node不参与工作负载。这是因为当前的master节点被打上了node-role.kubernetes.io/master:NoSchedule的污点:

[root@master] ~$ kubectl describe nodes master.hanli.com |grep -E '(Roles|Taints)'
Roles:              master
Taints:             node-role.kubernetes.io/master:NoSchedul

因为这里搭建的是测试环境,内存资源不太足,可以选择去掉这个污点使master来承担一些工作负载:

先看一下taint命令的语法格式

kubectl taint node [node] key=value[effect]  

其中[effect] 可取值: [ NoSchedule | PreferNoSchedule | NoExecute ]

NoSchedule: 一定不能被调度

PreferNoSchedule: 尽量不要调度,实在没有地方调度的情况下,才考虑可以调度过来

NoExecute: 不仅不会调度, 还会立即驱逐Node上已有的Pod

现在去掉污点:key的值node-role.kubernetes.io,value为空

[root@master] ~$ kubectl taint nodes master.hanli.com node-role.kubernetes.io/master-
node/master.hanli.com untainted

修改后查看Taints字段状态:

 
  1. [root@master] ~$ kubectl describe nodes master.hanli.com |grep -E '(Roles|Taints)'

  2. Roles: <none>

  3. Taints: <none>

如果要重新使master打上污点,即恢复Master 的不可调度状态,执行如下命令:

 
  1. [root@master] ~$ kubectl taint nodes master.hanli.com node-role.kubernetes.io/master=:NoSchedule

  2. node/master.hanli.com tainted

这里要注意的是如果你丢掉了“=”,会报 error: at least one taint update is required错误

 

[root@master] ~$ kubectl taint nodes master.hanli.com node-role.kubernetes.io/master:NoSchedule

error: at least one taint update is required

除了直接去除污点,我们还可以在pod的yaml 配置文件中添加tolerations 字段来容忍 节点的污点

例如,如果你想让你的pod可以被调度到master节点上,在 pod 的 spec 中添加如下设置即可:

 

tolerations:

- key: "node-role.kubernetes.io/master"

operator: "Exists"

effect: "NoSchedule"

更多推荐

ECharts

ECharts是一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。ECharts提供了常规的折线图、柱状图、散点图、饼图、K线图,用于统计的盒形图,用于地理数据可视化的地图、热力图、线图,用于关系数据可视化的关系图、treemap、旭日图,多维数据可视化的平行坐标,还

Android 12 源码分析 —— 应用层 六(StatusBar的UI创建和初始化)

Android12源码分析——应用层六(StatusBar的UI创建和初始化)在前面的文章中,我们分别介绍了Layout整体布局,以及StatusBar类的初始化.前者介绍了整体上面的布局,后者介绍了三大窗口的创建的入口处,以及需要做的准备工作.现在我们分别来细化三大窗口的UI创建和初始化,首先从StatusBar窗口

【初阶数据结构】——堆排序和TopK问题

=========================================================================个人主页代码仓库C语言专栏初阶数据结构专栏Linux专栏===========================================================

在React中使用Immutable.js

Immutable的几种数据类型在React中使用Immutable.js实例扩展LodashLodash常用api分类Lodash中常用的API介绍:Lodash中api和javascript中api有什么不同react中如何使用LodashImmutable的几种数据类型List:有序索引集,类似JavaScrip

新版发布 | Cloudpods v3.10.5 和 v3.9.13 正式发布

Cloudpodsv3.10.5本期发布中,ocboot部署脚本有较多变化,首先支持以非root用户执行安装流程,其次响应社区的呼吁,增加了–stack参数,允许Allinone一键安装仅包含私有云(参数为edge)或云管(参数为cmp)的部署。本期亮点为KVM虚拟机对GPU的支持,不仅支持了虚拟机挂载图形模式的GPU

MacOS 控制固态磁盘写入量,设置定时任务监控

M1芯片的内存交换策略非常激进,导致内存较小的机型固态硬盘写入量十分恐怖,网上很多人都有类似的遭遇。如何看待8G256GM1MacBookAir使用一个月硬盘写入22TB+?而固态硬盘是有擦除、写入寿命的,一般就按100次算,256G大概就是250TB。当然,并不是说超过这个数,硬盘就坏了,只是一般超过这个数,再坏,厂

9.2 【MySQL】独立表空间结构

9.2.1区(extent)的概念对于16KB的页来说,连续的64个页就是一个区,也就是说一个区默认占用1MB空间大小。不论是系统表空间还是独立表空间,都可以看成是由若干个区组成的,每256个区被划分成一组。画个图表示就是这样:其中extent0~extent255这256个区算是第一个组,extent256~exte

Qt 数据库的注册和登录功能

widget.h#ifndefWIDGET_H#defineWIDGET_H#include<QPushButton>#include<QWidget>#include<QDebug>#include<QString>#include<QMessageBox>#include<QFile>#include"client

Linux下的第一个小程序——进度条

目录​编辑一,进度条的第一个版本1.准备工作2.写Makefile文件3.开始构建进度条1.process.h文件2.process.c文件3.main.c文件二,进度条的第二个版本1.为什么还要写第二个版本?2.如何升级?3.升级代码1.搭建场景一,进度条的第一个版本1.准备工作在写进度条之前,我们得把前期的准备工作

01_网络编程_传统IO

网络编程1.什么是网络编程在网络通信协议下,不同计算机上运行的程序,进行的数据传输。如果想把一个计算的结果,或者是电脑上的文件通过网络传递给你的朋友,就需要用到网络编程。在实际生活中,网络通信无处不在**应用场景:**即时通信、网游对战、金融证券、国际贸易、邮件、等等不管是什么场景,都是计算机跟计算机之间通过网络进行数

【C++】C++ 语言对 C 语言的加强 ② ( 变量检测增强 - C++ 不允许重复定义变量 | struct 关键字增强 - struct 作用等同于 class )

文章目录一、变量检测增强-C++不允许重复定义变量二、struct关键字增强-struct作用等同于class一、变量检测增强-C++不允许重复定义变量在早期的C语言编译器版本中,可以重复定义多个同名的全局变量,编译器会将这些同名的全局变量链接到全局数据区的相同地址空间中;如:在一个头文件中,定义了变量inta;,在另

热文推荐