Digitalocean搭建K8S1.22.0集群

2 篇文章 0 订阅
Digitalocean 操作系统配置ip角色kubeadm versiondocker version
Centos 7 x642 vCPUs 2GB / 60GB Disk143.110.156.94Master1.22.020.10.8
Centos 7 x641 vCPU 2GB / 50GB Disk143.198.53.254worker1.22.020.10.8
Centos 7 x641 vCPU 2GB / 50GB Disk143.198.100.187worker1.22.020.10.8

一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令
每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)
2 CPU 核或更多
集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。
开启机器上的某些端口。请参见这里 了解更多详细信息。
禁用交换分区。为了保证 kubelet 正常工作,你 必须 禁用交换分区。

检查节点

MAC 地址唯一性

#  product_uuid 校验
sudo cat /sys/class/dmi/id/product_uuid

一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。 Kubernetes 使用这些值来唯一确定集群中的节点。

允许 iptables 检查桥接流量

确保 br_netfilter 模块被加载。这一操作可以通过运行 lsmod | grep br_netfilter 来完成。若要显式加载该模块,可执行 sudo modprobe br_netfilter

##显式加载该模块
sudo modprobe br_netfilter

[root@centos-k8s-node1 ~]# lsmod | grep br_netfilter
br_netfilter           22256  0 
bridge                151336  1 br_netfilter

为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 sysctl 配置中将 net.bridge.bridge-nf-call-iptables 设置为 1。

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

统一系统内核版本

内核版本

Docker 要求 CentOS 系统的内核版本高于 3.10

[root@centos-k8s-node1 ~]# uname -r
3.10.0-1160.36.2.el7.x86_64

系统防火墙配置

Digitalocean防火墙在Dashboard中配置,系统默认无防火墙。这里只用同步时区即可。

# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld

# 关闭selinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# 关闭swap
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab

# 配置iptables的ACCEPT规则
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT

# 时钟同步
yum install -y ntpdate
ntpdate -u cn.pool.ntp.org
#设置为北京时区
timedatectl set-timezone Asia/Shanghai
#重启
reboot

网络配置

外网访问

每个节点需要开启NAT网络模式,可访问宿主机的外网环境

修改hosts文件

配置三台机器设置hosts

vi /etc/hosts

#追加相应的hosts地址
#主机地址
143.110.156.94 master
#子节点地址
143.198.53.254 node1
#子节点地址
143.198.100.187 node2

# 设置94的hostname
sudo hostnamectl set-hostname master
# 设置254的hostname
sudo hostnamectl set-hostname node1
# 设置187的hostname
sudo hostnamectl set-hostname node2

配置后使用ping测试一下,各个机器是否能够ping通

安装docker和kube

更新并安装依赖

三台机器更新系统并安装相关依赖

yum -y update
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp

安装Docker

官方安装手册 https://docs.docker.com/engine/install/centos/

在每一台机器上都安装好Docker,版本为20.10.7

#按照必要依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

#设置docker仓库 1,2根据情况选择
# 1. 国内阿里云 【设置要设置一下阿里云镜像加速器】
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["这边替换成自己的实际地址"]
}
EOF
sudo systemctl daemon-reload

# 2. 海外默认 (是海外服务器,所以选择官方源)
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

#安装docker
yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io

#启动docker&开机运行docker
sudo systemctl start docker && sudo systemctl enable docker

安装kubeadm, kubelet, kubectl

官方安装手册:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

#国内设置阿里源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

yum  makecache -y fast

#海外设置google源
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

sudo systemctl enable --now kubelet

请注意:

  • 通过运行命令 setenforce 0sed ... 将 SELinux 设置为 permissive 模式 可以有效地将其禁用。 这是允许容器访问主机文件系统所必需的,而这些操作时为了例如 Pod 网络工作正常。

    你必须这么做,直到 kubelet 做出对 SELinux 的支持进行升级为止。

  • 如果你知道如何配置 SELinux 则可以将其保持启用状态,但可能需要设定 kubeadm 不支持的部分配置

检查所需端口

控制平面节点

协议方向端口范围作用使用者
TCP入站6443Kubernetes API 服务器所有组件
TCP入站2379-2380etcd 服务器客户端 APIkube-apiserver, etcd
TCP入站10250Kubelet APIkubelet 自身、控制平面组件
TCP入站10251kube-schedulerkube-scheduler 自身
TCP入站10252kube-controller-managerkube-controller-manager 自身

工作节点

协议方向端口范围作用使用者
TCP入站10250Kubelet APIkubelet 自身、控制平面组件
TCP入站30000-32767NodePort 服务†所有组件

Docker和k8s设置同一个cgroup

# docker
vi /etc/docker/daemon.json
{
    "exec-opts": ["native.cgroupdriver=systemd"]
}
    
systemctl restart docker
    
# kubelet,这边如果发现输出directory not exist,也说明是没问题的,大家继续往下进行即可
sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

[国内]使用阿里云下载镜像

查看kubeadm使用的镜像

可以发现这里都是国外的镜像

[root@centos-k8s-master ~]# kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.22.0
k8s.gcr.io/kube-controller-manager:v1.22.0
k8s.gcr.io/kube-scheduler:v1.22.0
k8s.gcr.io/kube-proxy:v1.22.0
k8s.gcr.io/pause:3.5
k8s.gcr.io/etcd:3.5.0-0
k8s.gcr.io/coredns/coredns:v1.8.4

解决国外镜像不能访问的问题

使用阿里云拉取镜像后修改tag为k8s需要的镜像

  • 创建kubeadm.sh脚本,用于拉取镜像/打tag/删除原有镜像
vi kubeadm.sh

#!/bin/bash
  set -e
  KUBE_VERSION=v1.21.1
  KUBE_PAUSE_VERSION=3.4.1
  ETCD_VERSION=3.4.13-0
  CORE_DNS_VERSION=1.8.0
  
  GCR_URL=k8s.gcr.io
  ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers
  
  images=(kube-proxy:${KUBE_VERSION}
  kube-scheduler:${KUBE_VERSION}
  kube-controller-manager:${KUBE_VERSION}
  kube-apiserver:${KUBE_VERSION}
  pause:${KUBE_PAUSE_VERSION}
  etcd:${ETCD_VERSION}
  coredns:${CORE_DNS_VERSION})
  
  for imageName in ${images[@]} ; do
    docker pull $ALIYUN_URL/$imageName
    docker tag  $ALIYUN_URL/$imageName $GCR_URL/$imageName
    docker rmi $ALIYUN_URL/$imageName
  done
  
  docker tag k8s.gcr.io/coredns:1.8.0 k8s.gcr.io/coredns/coredns:v1.8.0
  echo '镜像下载成功,将打印镜像列表';
  docker images|grep k8s.gcr.io
  echo '将执行 kubeadm config images list';
  kubeadm config images list
  echo '请对比镜像的名称和tag';
  • 运行脚本和查看镜像
# 运行脚本
sh ./kubeadm.sh

Master初始化过程

kube初始化master

注意此操作是在主节点上进行

初始化master节点

本地已有 kubeadm config images list 包含的镜像了,执行以下命令

记得保存执行 init 成功最后kubeadm join的信息

# 执行init
kubeadm init --pod-network-cidr=10.44.0.0/16/16 --kubernetes-version=v1.22.0 --apiserver-advertise-address=143.110.156.94

# 若一次没成功,要重新初始化集群状态:执行 kubeadm reset,进行上述操作
# 安装好后返回如下信息,后面会使用到

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 143.110.156.94:6443 --token pb61yh.fiwegdi5znexg964 \
	--discovery-token-ca-cert-hash sha256:b28656cd994d3312674a60e33a61b59ec3cac79517ff57c6dfae5f8ed8024d3b 

记录你的kubeadm join的命令

ubeadm join 143.110.156.94:6443 --token pb61yh.fiwegdi5znexg964 \
	--discovery-token-ca-cert-hash sha256:b28656cd994d3312674a60e33a61b59ec3cac79517ff57c6dfae5f8ed8024d3b  

要开始构建集群,根据提示执行如下

# 非root用户 执行如下
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# root用户也可以这样运行
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
#配置生效
source /etc/profile

查看pod验证是否构建成功

等待一会儿,同时可以发现像etc,controller,scheduler等组件都以pod的方式安装成功了

注意:coredns没有启动,需要安装网络插件

kubectl get pods -n kube-systemNAME                                        READY   STATUS    RESTARTS   AGEcoredns-78fcd69978-8htkj                    0/1     Pending   0          10mcoredns-78fcd69978-hdm87                    0/1     Pending   0          10metcd-centos-k8s-master                      1/1     Running   0          10mkube-apiserver-centos-k8s-master            1/1     Running   0          10mkube-controller-manager-centos-k8s-master   1/1     Running   0          10mkube-proxy-sfmdf                            1/1     Running   0          10mkube-scheduler-centos-k8s-master            1/1     Running   0          10m# 上面coredns模块没有启动,需要后面安装网络插件

健康检查

curl -k https://localhost:6443/healthzok

部署Calico网络插件

选择网络插件:https://kubernetes.io/docs/concepts/cluster-administration/addons/

calico网络插件:https://docs.projectcalico.org/v3.9/getting-started/kubernetes/

calico,同样在master节点上操作

#1.安装tigera-operator
kubectl create -f https://docs.projectcalico.org/manifests/tigera-operator.yaml

#2.通过custom-resources来安装 Calico
curl https://docs.projectcalico.org/manifests/custom-resources.yaml  -O

#根据使用 kubeadm 进行 k8s 集群初始化时传递的 --pod-network-cidr 参数,或许需要修改 calico.yaml
vim custom-resources.yaml

#将 192.168.0.0/16 修改为--pod-network-cidr=10.44.0.0/16,可以通过如下命令快速查找
kubectl apply -f calico.yaml

# 确认一下calico是否安装成功
kubectl get pods --all-namespaces -w

NAMESPACE     NAME                                        READY   STATUS              RESTARTS      AGE
kube-system   calico-kube-controllers-76bf499b46-bb9bc    0/1     Running			        0             61s
kube-system   calico-node-5gfmn                           0/1     Running             2 (20s ago)   61s
kube-system   coredns-78fcd69978-8htkj                    0/1     Running             0             13m
kube-system   coredns-78fcd69978-hdm87                    0/1     Running             0             13m
kube-system   etcd-centos-k8s-master                      1/1     Running             0             13m
kube-system   kube-apiserver-centos-k8s-master            1/1     Running             0             13m
kube-system   kube-controller-manager-centos-k8s-master   1/1     Running             0             13m
kube-system   kube-proxy-sfmdf                            1/1     Running             0             13m
kube-system   kube-scheduler-centos-k8s-master            1/1     Running             0             13m

# 3.命令确认所有 pod 都在运行
watch kubectl get pods -n calico-system
# 4.删除 master 上的污点,以便您可以在其上安排 pod
kubectl taint nodes --all node-role.kubernetes.io/master- # 应该返回以下内容 node/<your-hostname> untainted
#5. 使用命令确认您的集群中现在有一个节点
kubectl get nodes -o wide

calicoctl工具安装

calicoctl命令行工具,它用于管理 Calico 策略和配置,以及查看详细的集群状态。

#进入/usr/local/bin/
cd /usr/local/bin/
#下载calicoctl
curl -o calicoctl -O -L  "https://github.com/projectcalico/calicoctl/releases/download/v3.20.0/calicoctl" 
#设置为可执行文件
chmod +x calicoctl

工作节点加入集群

kube worker join cluster

使用初始化master节点的最后打印信息

拿着上面init执行的命令到worker node进行执行

## 在node1和node2上执行上述命令
kubeadm join 143.110.156.94:6443 --token pb61yh.fiwegdi5znexg964 \
	--discovery-token-ca-cert-hash sha256:b28656cd994d3312674a60e33a61b59ec3cac79517ff57c6dfae5f8ed8024d3b  

在master节点上检查集群信息
请添加图片描述

需要等待片刻

##查看pods
kubectl get pods --all-namespaces -w

请添加图片描述

等待所有的status变成Running,node的状态才会变成Ready

都变成Ready状态后集群即搭建成功。

验证阶段

发布Pod,验证集群安装状态

##定义pod.yml文件,比如pod_nginx_rs.yaml
cat > pod_nginx_rs.yaml <<EOF
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
  labels:
    tier: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      name: nginx
      labels:
        tier: frontend
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
EOF
##根据pod_nginx_rs.yml文件创建pod
kubectl apply -f pod_nginx_rs.yaml 
#返回结果 replicaset.apps/nginx created

查看pod

[root@centos-k8s-master ~]# kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
nginx-2mg69   1/1     Running   0          78s
nginx-5797q   1/1     Running   0          78s
nginx-nn6r5   1/1     Running   0          78s

验证nginx

# 在集群内运行一下三行都可以返回结果
curl master
curl node1
curl node2

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
#删除podkubectl delete -f pod_nginx_rs.yaml
在Ubuntu 20.04上安装Kubernetes(k8s),你可以按照以下步骤进行操作: 1. 首先,你可以根据[参考1]中提供的博客文章,按照里面的指导进行安装。该博客文章提供了适用于任何版本的Kubernetes安装的方法。 2. 在安装Kubernetes之前,你可能需要禁用SELinux。你可以参考[参考2]中提供的教程,了解如何在Ubuntu 20.04上禁用或启用SELinux。 3. 在生产环境中,建议使用防火墙并开放指定的端口。你可以使用以下命令禁用Ubuntu上的ufw防火墙: ```shell sudo ufw disable ``` 如果你使用的是CentOS,则可以使用以下命令停止firewalld服务并禁用启动: ```shell systemctl stop firewalld && systemctl disable firewalld ``` 注:以上命令是针对Ubuntu和CentOS的示例,请根据你的实际操作系统进行相应调整。 4. 在安装完成后,你可能需要修改Kubernetes的配置以满足你的需求。你可以根据实际情况进行调整和配置。 请记住,这只是一个大致的指导,具体的步骤和配置可能会因你的环境和需求而有所不同。因此,建议你参考[参考1]中提供的博客文章,以获得更详细的安装步骤和配置说明。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [ubuntu20.04安装k8s(1.18.4 & 1.22.0)](https://blog.csdn.net/qq_43159578/article/details/123849175)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值