安装
笔记
此篇尝试基于 kubeadm 的非高可用 Kubernetes 集群安装,它并不完整,且可代替的方案有很多,比如 k3s、minikube,或是直接购买云厂商的 k8s 集群服务。
# 前置条件
# 安装 Docker
# 一键安装
curl -sSL https://get.daocloud.io/docker | sh
# 设置
一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令。推荐使用 Ubuntu。
每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)
2 CPU 核或更多
集群中的所有机器的网络彼此均能相互连接 (公网和内网都可以)
- 设置防火墙放行规则
节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里 (opens new window)了解更多详细信息。
设置不同 hostname
# 查看主机名 hostname # 修改主机名 hostnamectl set-hostname <新名字>
开启机器上的某些端口。请参见这里 (opens new window) 了解更多详细信息。
- 内网互信
禁用交换分区。为了保证 kubelet 正常工作,你 必须 禁用交换分区。
- 永久关闭
笔记
在极客时间 - 张磊的教程中,并不需要此笔
#各个机器设置自己的域名
hostnamectl set-hostname xxxx
# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
#关闭swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
#允许 iptables 检查桥接流量
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
#各个机器设置自己的域名
hostnamectl set-hostname xxxx
# 将 SELinux 设置为 permissive 模式(相当于将其禁用) 默认没有安装
#关闭swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
#允许 iptables 检查桥接流量
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
// Make sure to add code blocks to your code group
# 镜像源(可选)
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
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
// Make sure to add code blocks to your code group
参考:https://developer.aliyun.com/mirror/kubernetes
# 安装 kubeadm
安装 kubelet、kubeadm 和 kubectl,并锁定其版本
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes
sudo apt update
sudo apt install kubelet=1.20.9-00
sudo apt install kubeadm=1.20.9-00
sudo apt install kubectl=1.20.9-00
sudo apt-mark hold kubelet kubeadm kubectl
// Make sure to add code blocks to your code group
# 启动 kubelet
sudo systemctl enable --now kubelet
systemctl status kubelet #检查状态
# 下载 Docker 镜像
# Master
sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done
EOF
chmod +x ./images.sh && ./images.sh
# 节点
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/kube-proxy:v1.20.9
# 修改 hosts
所有服务器执行
echo "<主节点内网IP> cluster-endpoint" >> /etc/hosts
# 主节点 - 初始化
kubeadm init \
--apiserver-advertise-address=<主节点内网IP> \
--control-plane-endpoint=cluster-endpoint \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16
cluster-endpoint
:hosts 映射的域名
提示this Docker version is not on the list of validated versions: 20.10.5+dfsg1...版本过高
这是一个 warning 警告,无视即可!
master主节点初始化报错 /proc/sys/net/ipv4/ip_forward contents are not set to 1
允许数据包转发
临时生效:
echo 1 > /proc/sys/net/ipv4/ip_forward
永久生效:
编辑 /etc/sysctl.conf
文件,修改成 net.ipv4.ip_forward = 1
,然后执行 sysctl -p
可以立即生效
看到 Your Kubernetes control-plane has initialized successfully!
复制保存这段内容,稍后用到!有效期 24 小时
- 上面一段 join 命令,在其他服务器执行,作为主结点
- 下面一段 join 命令,在其他服务器执行,加入普通结点
查看集群所有节点
kubectl get nodes
# 主节点 - 安装网络组件
# 下载配置
curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O
# 应用到k8s
kubectl apply -f calico.yaml
# 工作节点 - 加入集群
复制上面主节点初始化成功后的,下面那段命令。
工作结点服务器执行时卡住
检查主节点服务器防火墙是否关闭
主节点检查结点状态
root@VM-12-12-debian:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
vm-12-12-debian Ready control-plane,master 28m v1.20.9
vm-12-16-debian Ready <none> 2m21s v1.20.9
vm-12-9-debian Ready <none> 2m33s v1.20.9
如果 status 不是 ready 就使用 kubectl get pods -A
查看下
主节点初始化时的加入令牌过期了怎么办?
在主节点运行 kubeadm token create --print-join-command
创建新令牌
# 安装 dashboard 可视化
下载配置
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
设置访问端口
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
把 type: ClusterIP
改为 type: NodePort
查看端口
kubectl get svc -A |grep kubernetes-dashboard
访问 https://<ip>:<端口>
部署成功后无法访问,如超时
查看 pod (容器) 部署在 node 上
kubectl describe pod -n <命名空间> <pod名称>
访问 node 的 ip 地址即可访问成功!
创建访问账号
dash.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
kubectl apply -f dash.yaml
获取访问令牌
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"
生成的 token 复制到网页