03-Kubernetes 集群安装

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。。。。

通过令牌访问进入如下页面

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值