页次: 1
K8S搭建手册
部署环境
准备开始
- 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令
- 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)
- 2 CPU 核或更多
- 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
- 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。
- 开启机器上的某些端口。请参见这里 了解更多详细信息。
- 禁用交换分区。为了保证 kubelet 正常工作,你 必须 禁用交换分区。
确保每个节点上 MAC 地址和 product_uuid 的唯一性
- 你可以使用命令 ip link 或 ifconfig -a 来获取网络接口的 MAC 地址
- 可以使用 sudo cat /sys/class/dmi/id/product_uuid 命令对 product_uuid 校验
一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。 Kubernetes 使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装 失败。
OS
Description: CentOS Linux release 8.4.2105
Release: 8.4.2105
- 4台机器,并需要统一host文件
172.16.16.184 k8s001-master k8s001-master
172.16.16.193 k8s001-node k8s001-node
172.16.16.185 k8s002-node k8s002-node
172.16.16.186 k8s003-node k8s003-node
允许 iptables 检查桥接流量
确保 br_netfilter 模块被加载。这一操作可以通过运行 lsmod | grep br_netfilter 来完成。若要显式加载该模块,可执行 sudo modprobe 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
doker安装
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
配置 cgroup 驱动程序
容器运行时和 kubelet 都具有名字为 "cgroup driver" 的属性,该属性对于在 Linux 机器上管理 CGroups 而言非常重要。
警告:
你需要确保容器运行时和 kubelet 所使用的是相同的 cgroup 驱动,否则 kubelet 进程会失败。
相关细节可参见配置 cgroup 驱动。
sudo mkdir /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
yum repo准备
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/y … ge-key.gpg
EOF
安装kubelet
setenforce 0
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet
下载镜像
在master上执行
#!/bin/bash
url=registry.cn-hangzhou.aliyuncs.com/google_containers
version=v1.22.2
images=(kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}')
for imagename in ${images[@]} ; do
docker pull $url/$imagename
docker tag $url/$imagename k8s.gcr.io/$imagename
docker rmi -f $url/$imagename
k8s初始化
Kubeadm config print init-defaults > kubeadmin-config.yaml
Kubeadm init --config=kubeadmin-config.yaml
flannel初始化
wget https://github.com/coreos/flannel/raw/m … lannel.yml
kubectl apply -f kube-flannel.yml
Dashborad
kubectl apply -f https://raw.githubusercontent.com/kuber … ended.yaml
node加入集群
在master节点查看集群的token值
kubeadm token create --print-join-command
然后在各个node执行
查看集群状态
kubectl get cs
Kubectl get nodes
Kubectl get pod -A
离线
FAQ关键点:
1,公有云上部署k8s 可能出现分属于不同node的pod之间相互访问网络不通
参考: AliCloud VPC Backend for Flannel
https://github.com/flannel-io/flannel/b … backend.md
2,执行错误
E1009 14:18:41.052400 1 main.go:241] Failed to create SubnetManager: error retrieving pod spec for 'kube-system/kube-flannel-ds-amd64-x7b4s': pods "kube-flannel-ds-amd64-x7b4s" is forbidden: User "system:serviceaccount:kube-system:flannel" cannot get resource "pods" in API group "" in the namespace "kube-system"
- 权限修复
kubectl create clusterrolebinding gitlab-cluster-admin --clusterrole=cluster-admin --group=system:serviceaccounts --namespace=kube-system
3,linux内核版本
应高于4.0,建议最新
4,域名解析失败
检查安全规则,tcp,udp 的53端口都允许
kubeadmin init config
kubeadm config print init-defaults > kubeadmin-config.yaml
kubeadm init --config=kubeadmin-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 172.16.16.184
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
imagePullPolicy: IfNotPresent
name: node
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.22.2
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
scheduler: {}
若启用ipvs,需要增加
kubeProxy:
config:
mode: ipvs
FAQ
flannel
E1009 14:18:41.052400 1 main.go:241] Failed to create SubnetManager: error retrieving pod spec for 'kube-system/kube-flannel-ds-amd64-x7b4s': pods "kube-flannel-ds-amd64-x7b4s" is forbidden: User "system:serviceaccount:kube-system:flannel" cannot get resource "pods" in API group "" in the namespace "kube-system"
权限修复
kubectl create clusterrolebinding gitlab-cluster-admin --clusterrole=cluster-admin --group=system:serviceaccounts --namespace=kube-system
dashboard CrashLoopBackOff
手工pull dashboard image
dashboard 安装到 master
kubectl drain xxxx-node --force --ignore-daemonsets --delete-local-data
剔除所有node,则可
然后重新加入集群
kubectl uncordon xxx-node
pod访问外网不通
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
阿里云上可能出现不同node之间的Pod访问不通
参考: AliCloud VPC Backend for Flannel
https://github.com/flannel-io/flannel/b … backend.md
登录bashboard
获取tocken
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
最后测试k8s
写一个nginx pod yaml 文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app
spec:
selector:
matchLabels:
app: nginx
replicas: 4
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: bitnami/wordpress-nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
修改replica值,执行扩缩容
kubectl apply -f nginx.yaml
观察效果
kubectl get pod -A -o wide|grep nginx
离线
页次: 1