






















kubernetes 是什么
Kubernetes 特性
Kubeadm 概述
kubeadm 是 Kubernetes 项目自带的及集群构建工具,负责执行构建一个最小化的可用集群以及将其启动等的必要基本步骤,kubeadm 是 Kubernetes 集群全生命周期的管理工具,可用于实现集群的部署、升级、降级及拆除。kubeadm 部署 Kubernetes 集群是将大部分资源以 pod 的方式运行,例如(kube-proxy、kube-controller-manager、kube-scheduler、kube-apiserver、flannel) 都是以 pod 方式运行。Kubeadm 仅关心如何初始化并启动集群,余下的其他操作,例如安装 Kubernetes Dashboard、监控系统、日志系统等必要的附加组件则不在其考虑范围之内,需要管理员自行部署。Kubeadm 集成了 Kubeadm init 和 kubeadm join 等工具程序,其中 kubeadm init 用于集群的快速初始化,其核心功能是部署 Master 节点的各个组件,而 kubeadm join 则用于将节点快速加入到指定集群中,它们是创建 Kubernetes 集群最佳实践的“快速路径”。另外,kubeadm token 可于集群构建后管理用于加入集群时使用的认证令牌(token),而 kubeadm reset 命令的功能则是删除集群构建过程中生成的文件以重置回初始状态。
基于 centos7.9,docker-ce-20.10.18,kubelet-1.22.3-0
部署 Kubernetes 集群需要满足每个节点至少满足 2 核 CPU、2G 内存和 30GB 硬盘且都可以访问外网
| 角色 | IP |
|---|---|
| k8s-node1 | 1.1.1.1 |
| k8s-node2 | 1.1.1.2 |
| k8s-node3 | 1.1.1.3 |
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时
# 关闭swap
swapoff -a # 临时
vim /etc/fstab # 永久, 注释掉swap分区相关行
# 设置主机名
hostnamectl set-hostname <hostname>
# 添加hosts
cat >> /etc/hosts << EOF
1.1.1.1 k8s-node1
1.1.1.2 k8s-node2
1.1.1.3 k8s-node3
EOF
# 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system # 生效
# 时间同步
timedatectl set-timezone Asia/Shanghai
yum install ntpdate -y
ntpdate time.windows.com
Kubernetes 默认 CRI(容器运行时)为 Docker,因此先安装 Docker。
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum list docker-ce --show-duplicates
yum install docker-ce-20.10.23-3.el7.x86_64
配置镜像下载加速器,同时修改 docker 的 cgroupdriver 为 systemd
mkdir /etc/docker
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://jc0srqak.mirror.aliyuncs.com"
],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl daemon-reload
systemctl enable docker && systemctl start docker
docker info
添加阿里云 YUM 软件源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
这里指定版本号部署
yum install -y kubelet-1.22.3 kubeadm-1.22.3 kubectl-1.22.3
systemctl enable kubelet
systemctl start kubelet
在 1.1.1.1(Master)执行
kubeadm init \
--apiserver-advertise-address=1.1.1.1 \
--kubernetes-version v1.22.3 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all \
--image-repository registry.aliyuncs.com/google_containers
或者使用配置文件引导:
cat > kubeadm.conf << EOF
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.22.3
imageRepository: registry.aliyuncs.com/google_containers
networking:
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
EOF
kubeadm init --config kubeadm.conf --ignore-preflight-errors=all
拷贝 kubectl 使用的连接 k8s 认证文件到默认路径:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看 k8s 集群状态
kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Unhealthy Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused
controller-manager Healthy ok
etcd-0 Healthy {"health":"true","reason":""}
vim /etc/kubernetes/manifests/kube-scheduler.yaml
# 注释掉 --port=0 ,scheduler会自动重启,稍等一小会状态变为正常
kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true","reason":""}
在 192.168.150.102/103(Node)执行。
向集群添加新节点,执行在 kubeadm init 输出的 kubeadm join 命令:
kubeadm join 1.1.1.1:6443 --token esce21.q6hetwm8si29qxwn \
--discovery-token-ca-cert-hash sha256:00603a05805807501d7181c3d60b478788408cfe6cedefedb1f97569708be9c5
默认 token 有效期为 24 小时,当过期之后,该 token 就不可用了。这时就需要重新创建 token,操作如下:
kubeadm token create
kubeadm token list
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
63bca849e0e01691ae14eab449570284f0c3ddeea590f8da988c07fe2729e924
kubeadm join 1.1.1.1:6443 --token nuja6n.o3jrhsffiqs9swnu --discovery-token-ca-cert-hash
sha256:63bca849e0e01691ae14eab449570284f0c3ddeea590f8da988c07fe2729e924
或者直接命令快捷生成: kubeadm token create --print-join-command
Calico 是一个纯三层的数据中心网络方案,Calico 支持广泛的平台,包括 Kubernetes、OpenStack 等。
Calico 在每一个计算节点利用 Linux Kernel 实现了一个高效的虚拟路由器( vRouter) 来负责数据转发,而每个 vRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络内传播。
此外,Calico 项目还实现了 Kubernetes 网络策略,提供 ACL 功能。
版本对照表,在此页面可以看到 calico 每个版本支持的 kubernetes 的版本
安装 calico
wget --no-check-certificate https://docs.tigera.io/archive/v3.23/manifests/calico.yaml
修改 Pod 网络和网卡识别参数,Pod 网络与前面 kubeadm init 指定的一样
[root@k8s-node1 ~]# vim calico.yaml
# 修改位置:DaemonSet.spec.template.spec.containers.env
# 新增如下四行
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
- name: IP_AUTODETECTION_METHOD
value: interface=bond*,ens* #网卡名根据实际情况修改
kubectl apply -f calico.yaml
kubectl get pods -n kube-system
# 所有Pod起来后,节点状态应该都是Ready状态了
[root@k8s-node1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-node1 Ready control-plane,master 153m v1.22.3
k8s-node2 Ready <none> 151m v1.22.3
k8s-node3 Ready <none> 151m v1.22.3
cadvisor 负责提供数据,已集成到 k8s 中
Metrics-server 负责数据汇总,需额外安装
下载 yaml
wget --no-check-certificate https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.0/components.yaml
mv components.yaml metrics-server.yaml
修改 yaml
containers:
- args:
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP # 第一处修改
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls # 第二处修改
image: registry.aliyuncs.com/google_containers/metrics-server:v0.6.0 # 第三处修改
imagePullPolicy: IfNotPresent
--kubelet-insecure-tls
部署 metrics-server
[root@k8s-node1 ~]# kubectl apply -f metrics-server.yaml
[root@k8s-node1 ~]# kubectl get pods -n kube-system -l k8s-app=metrics-server
NAME READY STATUS RESTARTS AGE
metrics-server-7f66b69ff6-bkfqg 1/1 Running 0 59s
[root@k8s-node1 ~]# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-node1 226m 11% 2004Mi 54%
k8s-node2 97m 4% 1047Mi 28%
k8s-node3 98m 4% 1096Mi 29%
在 Kubernetes 集群中创建一个 pod,验证是否正常运行:
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --type=NodePort --port=80 --target-port=80
[root@k8s-node1 ~]# kubectl get pod,deploy,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-6799fc88d8-57bqd 1/1 Running 0 10m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx 1/1 1 1 10m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 170m
service/nginx NodePort 10.102.188.108 <none> 80:30954/TCP 2m31s
访问地址:http://1.1.1.1:30954,端口是固定的,ip 可以是集群内任一节点的 ip
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
默认 Dashboard 只能集群内部访问,修改 Service 为 NodePort 类型,暴露到外部:
vi recommended.yaml
...
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
- port: 443
targetPort: 8443
nodePort: 30001
selector:
k8s-app: kubernetes-dashboard
type: NodePort
...
kubectl apply -f recommended.yaml
kubectl get pods -n kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-6b4884c9d5-gl8nr 1/1 Running 0 13m
kubernetes-dashboard-7f99b75bf4-89cds 1/1 Running 0 13m
访问地址:https://NodeIP:30001
创建 service account 并绑定默认 cluster-admin 管理员集群角色:
# 创建用户
kubectl create serviceaccount dashboard-admin -n kube-system
# 用户授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
# 获取用户Token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
使用输出的 token 登录 Dashboard。
以上
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。