Digitalocean搭建K8S1.22.0集群
Digitalocean操作系统配置ip角色kubeadm versiondocker versionCentos 7 x642 vCPUs 2GB / 60GB Disk143.110.156.94Master1.22.020.10.8Centos 7 x641 vCPU 2GB / 50GB Disk143.198.53.254worker1.22.020.10.8Centos 7 x641
Digitalocean 操作系统 | 配置 | ip | 角色 | kubeadm version | docker version |
---|---|---|---|---|---|
Centos 7 x64 | 2 vCPUs 2GB / 60GB Disk | 143.110.156.94 | Master | 1.22.0 | 20.10.8 |
Centos 7 x64 | 1 vCPU 2GB / 50GB Disk | 143.198.53.254 | worker | 1.22.0 | 20.10.8 |
Centos 7 x64 | 1 vCPU 2GB / 50GB Disk | 143.198.100.187 | worker | 1.22.0 | 20.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 0
和sed ...
将 SELinux 设置为 permissive 模式 可以有效地将其禁用。 这是允许容器访问主机文件系统所必需的,而这些操作时为了例如 Pod 网络工作正常。你必须这么做,直到 kubelet 做出对 SELinux 的支持进行升级为止。
如果你知道如何配置 SELinux 则可以将其保持启用状态,但可能需要设定 kubeadm 不支持的部分配置
检查所需端口
控制平面节点
协议 | 方向 | 端口范围 | 作用 | 使用者 |
---|---|---|---|---|
TCP | 入站 | 6443 | Kubernetes API 服务器 | 所有组件 |
TCP | 入站 | 2379-2380 | etcd 服务器客户端 API | kube-apiserver, etcd |
TCP | 入站 | 10250 | Kubelet API | kubelet 自身、控制平面组件 |
TCP | 入站 | 10251 | kube-scheduler | kube-scheduler 自身 |
TCP | 入站 | 10252 | kube-controller-manager | kube-controller-manager 自身 |
工作节点
协议 | 方向 | 端口范围 | 作用 | 使用者 |
---|---|---|---|---|
TCP | 入站 | 10250 | Kubelet API | kubelet 自身、控制平面组件 |
TCP | 入站 | 30000-32767 | NodePort 服务† | 所有组件 |
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
更多推荐
所有评论(0)