1、ubuntu配置静态IP
sudo password root # 配置root密码
参照链接:https://www.myfreax.com/how-to-configure-static-ip-address-on-ubuntu-20-04/
在Ubuntu 20.04上,系统使用“predictable network interface names(可预测的网络接口名称)”标识网络接口。
- 识别要配置的以太网接口的名称
geray@geray:~$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether 00:0c:29:55:50:d6 brd ff:ff:ff:ff:ff:ff
- 分配静态IP
Netplan配置文件存储在/etc/netplan目录中。 您可能会在此目录中找到一个或多个YAML文件。 文件的名称可能因安装程序而异。 通常,文件名为01-netcfg.yaml,50-cloud-init.yaml或NN_interfaceName.yaml
geray@geray:~$ ls /etc/netplan/
00-installer-config.yaml
geray@geray:~$ vim /etc/netplan/00-installer-config.yaml
- :set paste(ubuntu下的vim编辑器粘贴格式混乱)
在设备类型(ethernets)下,您可以指定一个或多个网络接口。 在此示例中,我们只有一个接口ens3,该接口被配置为从DHCP服务器dhcp4: yes获取IP寻址。 要将静态IP地址分配给ens32接口,请按照以下步骤编辑文件:
- 将DHCP设置为dhcp4: no。
- 指定静态IP地址。 在addresses:下,您可以添加一个或多个将分配给网络接口的IPv4或IPv6 IP地址。
- 指定网关。
- 在nameservers下,设置以下IP地址: 域名服务器。
# This is the network config written by 'subiquity'
network:
ethernets:
ens32:
dhcp4: false
addresses:
- 192.168.6.31/24
gateway4: 192.168.6.2
nameservers:
addresses: [8.8.8.8, 114.114.114.114]
version: 2
- gateway4地址根据自己的自行修改,我这里之前设置的是2(一般是1)
- 保存文件并应用更改
sudo netplan apply
- 验证更改
root@geray:~# ip addr show dev ens32
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:55:50:d6 brd ff:ff:ff:ff:ff:ff
inet 192.168.6.31/24 brd 192.168.6.255 scope global ens32
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe55:50d6/64 scope link
valid_lft forever preferred_lft forever
1. 初始化系统
sudo apt-get update
# 禁用swap分区(修改/etc/fstab,注释掉swap那行,持久化生效)
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
# 主机名规划
hostnamectl set-hostname <hostname>
hostnamectl set-hostname k8s-master-1
hostnamectl set-hostname k8s-node-1
# 同步时间
apt-get install ntpdate -y
ntpdate time.windows.com
# 确保每个机器不会自动suspend(待机/休眠)
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
设定时区:dpkg-reconfigure tzdata
选择Asia -> 再选择Shanghai -> OK
2、安装docker
官方地址:https://docs.docker.com/engine/install/ubuntu/
1. Uninstall old versions
sudo apt-get remove docker docker-engine docker.io containerd runc
2. 设置存储库
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
3. 添加Docker官方的GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
4. 使用以下命令设置稳定存储库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
5. 安装引擎
如果要安装特定版本如下:
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
apt-cache madison docker-ce # 列出版本
sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io
6. 验证
docker info
2、安装kubeadm
官方地址:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
其他参考:https://zhuanlan.zhihu.com/p/138554103
1. 验证每个节点的 MAC 地址和 product_uuid 是唯一的
- 您可以使用以下命令获取网络接口的 MAC 地址ip link或ifconfig -a
- product_uuid 可以通过命令查看 sudo cat /sys/class/dmi/id/product_uuid
# 查看ip
ip addr show ens33 | grep "inet " | cut -d '/' -f 1 | awk '{print $2}'
# 查看mac地址
ip link show ens33 | grep ether | awk '{print $2}'
2. 让 iptables 看到桥接流量
确保br_netfilter模块已加载。这可以通过运行来完成<font style="color:rgb(34, 34, 34);">lsmod | grep br_netfilter</font>
。
要显式加载它,请调用<font style="color:rgb(34, 34, 34);">sudo modprobe br_netfilter</font>
yaml
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
### 3. 安装 kubeadm、kubelet 和 kubectl
shell
#-------|1、更新apt包索引并安装使用 Kubernetesapt存储库所需的包:
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
#-------|2、下载 Google Cloud 公共签名密钥:
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
#-------|3、添加 Kubernetesapt存储库:
sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOF
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
#-------|4、更新apt包索引,安装 kubelet、kubeadm 和 kubectl,并固定它们的版本:
sudo apt-get update
# 列出版本号
apt-cache madison kubeadm
apt-cache madison kubelet
apt-cache madison kubectl
#sudo apt-get install -y kubelet kubeadm kubectl
# 安装指定版本
sudo apt-get install -y kubelet=1.21.5-00 kubeadm=1.21.5-00 kubectl=1.21.5-00
sudo apt-mark hold kubelet kubeadm kubectl
## 3、初始化master
shell
kubeadm init \
--apiserver-advertise-address=192.168.6.31 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.21.5 \
--service-cidr=10.95.0.0/12 \
--pod-network-cidr=10.224.0.0/16 \
--ignore-preflight-errors=all
+ —apiserver-advertise-address 集群通讯地址
+ —image-repository 由于默认拉取镜像是k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
+ —kubernetes-version k8s版本,与上面安装的一致
+ —service-cidr 集群内部虚拟网络,pod统一访问
+ —pod-network-cidr pod网络,与下面部署的CNI网络组件yaml中保持一致
初始化完成如下:
shell
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
Your Kubernetes control-plane has initialized successfully!
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
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.6.31:6443 --token 8k7mve.082ye7qg4a6zcocm \
--discovery-token-ca-cert-hash sha256:001044ea88096154999d35253224d1850f140aa54810a968da5d12af2742115c
初始化完成后,记住最后输出的kebeadm join
命令,其他节点加入时需要使用,根据初始化提示信息拷贝kebectl使用的连接k8s认证文件到默认路径
查看工作节点
root@k8s-master-1:~# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master-1 NotReady control-plane,master 3m46s v1.21.5
- 注:由于还没有部署网络插件,所以节点会显示为准备
NotReady
状态 - 参考资料:
https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/#config-file
4、加入node节点
到node节点执行初始化的join命令
- 注:默认token有效期是24小时,当过期之后,该token将不可用;这时需要创建新的token:
kubeadm token create --print-join-command
5、部署网络插件
Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。
下载Calico的YUM文件:
wget https://docs.projectcalico.org/manifests/calico.yaml
下载完成后还需要修改里面定义内容:
- pod网络(CALICO_IPV4POOL_CIDR),与前面
<font style="color:#F5222D;">kubeadm init</font>
中<font style="color:#F5222D;">--pod-network-cidr</font>
指定一样 - 关闭ipip模式和修改typha_service_name 和修改replicas
calico网络,默认是ipip模式(在每台node主机创建一个tunl0网口,这个隧道链接所有的node容器网络,官网推荐不同的ip网段适合,比如aws的不同区域主机)
- 注:下面这里我们暂时只修改最后一步,pod网络(CALICO_IPV4POOL_CIDR)
# 关闭ipip模式
- name: CALICO_IPV4POOL_IPIP
value: "off"
# 修改typha_service_name
typha_service_name: "calico-typha"
# 修改
replicas: 1
revisionHistoryLimit: 2
# 修改pod的网段CALICO_IPV4POOL_CIDR
- name: CALICO_IPV4POOL_CIDR
value: "10.224.0.0/16"
问题处理:Error querying BIRD: unable to connect to BIRDv4 socket
Warning Unhealthy 19s kubelet Readiness probe failed: calico/node is not ready: BIRD is not ready: Error querying BIRD: unable to connect to BIRDv4 socket: dial unix /var/run/calico/bird.ctl: connect: connection refused
Warning Unhealthy 14s kubelet Readiness probe failed: 2021-12-24 08:56:37.477 [INFO][197] confd/health.go 180: Number of node(s) with BGP peering established = 0
calico/node is not ready: BIRD is not ready: BGP not established with 192.168.6.31
Warning Unhealthy 4s kubelet Readiness probe failed: 2021-12-24 08:56:47.414 [INFO][239] confd/health.go 180: Number of node(s) with BGP peering established = 0
添加相关网卡参数
参考链接:https://www.codenong.com/cs109711759/
- env:
- name: IP_AUTODETECTION_METHOD
value: interface=ens32 # 填写自己实际对应的网卡名称
修改完成之后部署:
kubectl apply -f calico.yaml
kubectl get pods -n kube-system
root@k8s-master-1:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master-1 Ready control-plane,master 16m v1.21.5
k8s-node-1 Ready <none> 11m v1.21.5
展示集群详细信息:
kubectl cluster-info