1、ubuntu配置静态IP

  1. 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(可预测的网络接口名称)”标识网络接口。

  1. 识别要配置的以太网接口的名称
  1. geray@geray:~$ ip link
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
  5. link/ether 00:0c:29:55:50:d6 brd ff:ff:ff:ff:ff:ff
  1. 分配静态IP
Netplan配置文件存储在/etc/netplan目录中。 您可能会在此目录中找到一个或多个YAML文件。 文件的名称可能因安装程序而异。 通常,文件名为01-netcfg.yaml50-cloud-init.yamlNN_interfaceName.yaml
  1. geray@geray:~$ ls /etc/netplan/
  2. 00-installer-config.yaml
  3. 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地址: 域名服务器。
  1. # This is the network config written by 'subiquity'
  2. network:
  3. ethernets:
  4. ens32:
  5. dhcp4: false
  6. addresses:
  7. - 192.168.6.31/24
  8. gateway4: 192.168.6.2
  9. nameservers:
  10. addresses: [8.8.8.8, 114.114.114.114]
  11. version: 2
  • gateway4地址根据自己的自行修改,我这里之前设置的是2(一般是1)
  1. 保存文件并应用更改
  1. sudo netplan apply
  1. 验证更改
  1. root@geray:~# ip addr show dev ens32
  2. 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
  3. link/ether 00:0c:29:55:50:d6 brd ff:ff:ff:ff:ff:ff
  4. inet 192.168.6.31/24 brd 192.168.6.255 scope global ens32
  5. valid_lft forever preferred_lft forever
  6. inet6 fe80::20c:29ff:fe55:50d6/64 scope link
  7. valid_lft forever preferred_lft forever

1. 初始化系统

  1. sudo apt-get update
  2. # 禁用swap分区(修改/etc/fstab,注释掉swap那行,持久化生效)
  3. swapoff -a # 临时
  4. sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
  5. # 主机名规划
  6. hostnamectl set-hostname <hostname>
  7. hostnamectl set-hostname k8s-master-1
  8. hostnamectl set-hostname k8s-node-1
  9. # 同步时间
  10. apt-get install ntpdate -y
  11. ntpdate time.windows.com
  12. # 确保每个机器不会自动suspend(待机/休眠)
  13. sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
  1. 设定时区:dpkg-reconfigure tzdata
  2. 选择Asia -> 再选择Shanghai -> OK

2、安装docker

官方地址:https://docs.docker.com/engine/install/ubuntu/

1. Uninstall old versions

  1. sudo apt-get remove docker docker-engine docker.io containerd runc

2. 设置存储库

  1. sudo apt-get install \
  2. apt-transport-https \
  3. ca-certificates \
  4. curl \
  5. gnupg \
  6. lsb-release

3. 添加Docker官方的GPG密钥

  1. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

4. 使用以下命令设置稳定存储库

  1. echo \
  2. "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  3. $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

5. 安装引擎

  1. sudo apt-get update
  2. sudo apt-get install docker-ce docker-ce-cli containerd.io
如果要安装特定版本如下:
  1. apt-cache madison docker-ce # 列出版本
  2. sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io

6. 验证

  1. 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 linkifconfig -a
  • product_uuid 可以通过命令查看 sudo cat /sys/class/dmi/id/product_uuid
  1. # 查看ip
  2. ip addr show ens33 | grep "inet " | cut -d '/' -f 1 | awk '{print $2}'
  3. # 查看mac地址
  4. 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认证文件到默认路径

查看工作节点

  1. root@k8s-master-1:~# kubectl get node
  2. NAME STATUS ROLES AGE VERSION
  3. 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

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#initializing-your-control-plane-node

4、加入node节点

到node节点执行初始化的join命令

  • 注:默认token有效期是24小时,当过期之后,该token将不可用;这时需要创建新的token:
  1. kubeadm token create --print-join-command

5、部署网络插件

Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。

下载Calico的YUM文件:

  1. 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的不同区域主机)
修改成BGP模式,它会以daemonset方式安装在所有node主机,每台主机启动一个bird(BGPclient),它会将calico网络内的所有node分配的ip段告知集群内的主机,并通过本机的网卡eth0或者ens33转发数据
  • 注:下面这里我们暂时只修改最后一步,pod网络(CALICO_IPV4POOL_CIDR
  1. # 关闭ipip模式
  2. - name: CALICO_IPV4POOL_IPIP
  3. value: "off"
  4. # 修改typha_service_name
  5. typha_service_name: "calico-typha"
  6. # 修改
  7. replicas: 1
  8. revisionHistoryLimit: 2
  9. # 修改pod的网段CALICO_IPV4POOL_CIDR
  10. - name: CALICO_IPV4POOL_CIDR
  11. value: "10.224.0.0/16"

问题处理:Error querying BIRD: unable to connect to BIRDv4 socket

  1. 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
  2. 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
  3. calico/node is not ready: BIRD is not ready: BGP not established with 192.168.6.31
  4. 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/

  1. - env:
  2. - name: IP_AUTODETECTION_METHOD
  3. value: interface=ens32 # 填写自己实际对应的网卡名称

修改完成之后部署:

  1. kubectl apply -f calico.yaml
  2. kubectl get pods -n kube-system
  1. root@k8s-master-1:~# kubectl get nodes
  2. NAME STATUS ROLES AGE VERSION
  3. k8s-master-1 Ready control-plane,master 16m v1.21.5
  4. k8s-node-1 Ready <none> 11m v1.21.5

展示集群详细信息:

  1. kubectl cluster-info