Kubernetes 集群安装
一、Kubernetes 核心组件架构
如图所示
Kubernetes 核心组件 kubeadm 、kubectl 、kubelet 所以每台机子都需要先安装 此3个插件 下面我们就来开始集群安装
二、kubeadm 集群安装
由于 kubernetes 是依赖 容器化的编排系统所以在安装集群前需要先安装 Docker
1、Docker 安装
Docker 安装教程.note
2、 集群限制和基础环境配置
- 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令
- 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)
- 2 CPU 核或更多
- 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
- 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。
- 开启机器上的某些端口。请参见这里 了解更多详细信息。
- 禁用交换分区。为了保证 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
#关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
#允许 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
3. 安装 kubelet 、kubeadm、kubectl
# 首先创建一个脚本 设置镜像参考地址改为阿里云提高速度
cat <<EOF | sudo tee /etc/yum.repos.d/ubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enable=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package.gpg
exclude=kubelet kubeadm kubectl
EOF
#安装3大件
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes
# 启动并加入自启
sudo systemctl enable --now kubelet
#查看是否安装成功
yum list installed | grep kubelet
yum list installed | grep kubeadm
yum list installed | grep kubectl
kubelet 现在每个几秒就会重启,因为它陷入了一个等待kubeadm指令的死循环
4、配置 cgroup 驱动程序
要修改 docker 的 cgroup 驱动配置
vi /etc/docker/daemon.json
# 在{} 中添加
"exec-opts": ["native.cgroupdriver=systemd"]
#如下
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://4y2030zl.mirror.aliyuncs.com"]
}
5、创建下载镜像的脚本(可选)
目的只是为了在安装前先把镜像下来,方式官网下载访问过慢而导致安装失败 同时可以统一版本
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 775 ./images.sh
#执行脚本
./images.sh
#查询镜像下载情况
docker images
EPOSITORY TAG IMAGE ID CREATED SIZE
rancher/mirrored-flannelcni-flannel v0.16.3 8cb5de74f107 2 weeks ago 59.7MB
rancher/mirrored-flannelcni-flannel-cni-plugin v1.0.1 ac40ce625740 4 weeks ago 8.1MB
registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/kube-proxy v1.20.9 8dbf9a6aa186 7 months ago 99.7MB
registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/kube-controller-manager v1.20.9 eb07fd4ad3b4 7 months ago 116MB
registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/kube-scheduler v1.20.9 295014c114b3 7 months ago 47.3MB
registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/kube-apiserver v1.20.9 0d0d57e4f64c 7 months ago 122MB
registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/etcd 3.4.13-0 0369cf4303ff 17 months ago 253MB
registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/coredns 1.7.0 bfe3a36ebd25 20 months ago 45.2MB
registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/pause 3.2 80d28bedfe5d 2 years ago 683kB
6、初始化主节点(Master)
# 所有机器添加master域名映射,下面的IP需要修改为自己的主节点IP
echo "192.168.211.8 cluster-endpoint" >> /etc/hosts
#使用 ping cluster-endpoint 方式验证 网络是否通
# 主节点运行初始化
kubeadm init \
--apiserver-advertise-address=192.168.211.8 \
--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=10.244.0.0/16
#所有设置的网络不能重叠
安装成功后 copy 如下 按照步骤执行下面的操作
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/
You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
kubeadm join cluster-endpoint:6443 --token a2wh79.e2nbwb7mw6ocejme \
--discovery-token-ca-cert-hash sha256:cad3a0e446849cb0d9d9f60e8bed53a4c1e3047476843b7296e278abd538658a \
--control-plane
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join cluster-endpoint:6443 --token a2wh79.e2nbwb7mw6ocejme \
--discovery-token-ca-cert-hash sha256:cad3a0e446849cb0d9d9f60e8bed53a4c1e3047476843b7296e278abd538658a
按照上面说明 需要执行如下命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
通过 kubectl get nodes 查询节点装
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NoReady control-plane,master 18m v1.20.9
#这是显示 noReady 是因为网络插件此时还没有安装 后续安装网络插件
7、设置网络插件
这里我们选择 flannel 插件,如果喜欢安装别的插件可以参考官网
flannel 默认使用的IP段 10.244.0.0/16 所以在上面 init 时 -pod-network-cidr 设置成 10.244.0.0/16
# 下载l 脚本 k8s 插件都可以通过yaml脚本自动安装 使用 apply 命令
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
# 为了怕网络卡端 可以使用 wget 方式 先把配置下载下来
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
#安装网络插件
kubectl apply -f kube-flannel.yml
检查安装状态
[root@k8s-master k8s_yml]# kubectl get pods -A -w
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-5897cd56c4-57nfx 1/1 Running 0 20m
kube-system coredns-5897cd56c4-c2w9g 1/1 Running 0 20m
kube-system etcd-k8s-master 1/1 Running 0 21m
kube-system kube-apiserver-k8s-master 1/1 Running 0 21m
kube-system kube-controller-manager-k8s-master 1/1 Running 0 21m
kube-system kube-flannel-ds-m9n89 1/1 Running 0 10m
kube-system kube-proxy-ckrwz 1/1 Running 0 20m
kube-system kube-scheduler-k8s-master 1/1 Running 0 21m
# 查看所有 pod 都是 Running 状态后 再次查询 node 的状态
kubectl get nodes
[root@k8s-master k8s_yml]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 101m v1.20.9
当节点状态是 Ready 是代表 集群主节点已经安装完毕
8、加入 Node 节点
使用主节点初始化后的秘钥进行加入
kubeadm join cluster-endpoint:6443 --token 秘钥
# 一般token 只有24小时有效期,过期后需要重新创建,使用如下命令进行 需要在主节点上执行
kubeadm token create --print-join-command
# 通过 命令查看节点的状态
kubectl get nodes
# 查看所有容器的状态
kubectl get pods -A
到此 k8s 集群就按照完成,后续需要安装 k8s 相关的一些镜像 主要是主节点。
9、安装Dashboard 可视化管理插件
kubernetes官方提供的可视化界面
https://github.com/kubernetes/dashboard
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
#由于是远程的脚本插件可以 先下载生成后在使用命令 安装
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
kubectl apply -f recommended.yaml
如果下载不下来请参考如下脚本
设置访问端口
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
#type: ClusterIP #¾ type: NodePort
# 执行 kubectl get svc -A |grep kubernetes-dashboard 命令 看到如下信息 443: 后面那个端口就是我们通过节点访问页面的端口
# 例如我们现在 节点 IP 192.168.211.8:30500
[root@k8s-master k8s_yml]# kubectl get svc -A |grep kubernetes-dashboard
kubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.96.210.70 <none> 8000/TCP 12m
kubernetes-dashboard kubernetes-dashboard NodePort 10.96.154.75 <none> 443:30500/TCP 12m
通过 https://节点IP:映射端口 本文实例 https://192.168.211.8:30500 访问页面
类似的问题都是因为证书错误导致的。而且 Dashbaord 的证书是自签名的,也会导致浏览器提示证书错误。
根本原因在于:在集群部署时,我们使用自签名证书,导致后续的自动创建的证书都属于自签名证书。
解决办法
(1) 删除默认的secret,用自签证书创建新的secret
kubectl delete secret kubernetes-dashboard-certs -n kubernetes-dashboard
#这里我们直接使用了kubernetes自带的 apiserver 证书可以使用自件证书
kubectl create secret generic kubernetes-dashboard-certs \
--from-file=/etc/kubernetes/pki/apiserver.key --from-file=/etc/kubernetes/pki/apiserver.crt -n kubernetes-dashboard
(2)修改 recommended.yaml 中内容 新增 - --tls-key-file=apiserver.key 和 - --tls-cert-file=apiserver.crt
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: kubernetes-dashboard
template:
metadata:
labels:
k8s-app: kubernetes-dashboard
spec:
containers:
- name: kubernetes-dashboard
image: kubernetesui/dashboard:v2.3.1
imagePullPolicy: Always
ports:
- containerPort: 8443
protocol: TCP
args:
- --auto-generate-certificates
- --namespace=kubernetes-dashboard
- --tls-key-file=apiserver.key
- --tls-cert-file=apiserver.crt
(3)重新加载 配置文件
kubectl apply -f recommended.yaml
(4) 在通过 kubectl get pods -A 查看运行状态都OK后
root@k8s-master certs]# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-5897cd56c4-57nfx 1/1 Running 0 6h37m
kube-system coredns-5897cd56c4-c2w9g 1/1 Running 0 6h37m
kube-system etcd-k8s-master 1/1 Running 0 6h38m
kube-system kube-apiserver-k8s-master 1/1 Running 0 6h38m
kube-system kube-controller-manager-k8s-master 1/1 Running 0 6h38m
kube-system kube-flannel-ds-96h2f 1/1 Running 0 4h55m
kube-system kube-flannel-ds-ckhw5 1/1 Running 1 4h53m
kube-system kube-flannel-ds-m9n89 1/1 Running 0 6h27m
kube-system kube-proxy-ckrwz 1/1 Running 0 6h37m
kube-system kube-proxy-f28qw 1/1 Running 0 4h55m
kube-system kube-proxy-w7wwg 1/1 Running 1 4h53m
kube-system kube-scheduler-k8s-master 1/1 Running 0 6h38m
kubernetes-dashboard dashboard-metrics-scraper-79c5968bdc-grsf6 1/1 Running 0 12m
kubernetes-dashboard kubernetes-dashboard-5f6b99665b-p8rqp 1/1 Running 0 10m
重复执行 上面 设置访问端口 命令
创建登录用户
(1) 创建一个管理用户脚本 dashboard-user.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: adimin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
(2)获取访问令牌
[root@k8s-master k8s_yml]# kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
Name: admin-user-token-v8b5s
Namespace: kubernetes-dashboard
Labels: <none>
Annotations: kubernetes.io/service-account.name: admin-user
kubernetes.io/service-account.uid: 30b0929c-e302-4e4a-85dd-f75641cb46b4
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1066 bytes
namespace: 20 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6ImJ。。。。
通过令牌访问进入如下页面