小言_互联网的博客

k8s---集群极速安装 && 安装k8s dashboard

465人阅读  评论(0)

一.简介

Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。

1.1 Kubernetes不是什么

  • Kubernetes 不是传统的、包罗万象的 PaaS(平台即服务)系统。

  • Kubernetes 在容器级别而不是在硬件级别运行

  • 它提供了 PaaS 产品共有的一些普遍适用的功能, 例如部署、扩展、负载均衡、日志记录和监视。

  • 但是,Kubernetes 不是单体系统,默认解决方案都是可选和可插拔的。 Kubernetes 提供了构建开发人员平台的基础,但是在重要的地方保留了用户的选择和灵活性。

Kubernetes:

  • 不限制支持的应用程序类型。 Kubernetes 旨在支持极其多种多样的工作负载,包括无状态、有状态和数据处理工作负载。 如果应用程序可以在容器中运行,那么它应该可以在 Kubernetes 上很好地运行。

  • 不部署源代码,也不构建你的应用程序。 持续集成(CI)、交付和部署(CI/CD)工作流取决于组织的文化和偏好以及技术要求。

  • 不提供应用程序级别的服务作为内置服务,例如中间件(例如,消息中间件)、 数据处理框架(例如,Spark)、数据库(例如,mysql)、缓存、集群存储系统 (例如,Ceph)。这样的组件可以在 Kubernetes 上运行,并且/或者可以由运行在 Kubernetes 上的应用程序通过可移植机制(例如, 开放服务代理)来访问。

  • 不要求日志记录、监视或警报解决方案。 它提供了一些集成作为概念证明,并提供了收集和导出指标的机制。

  • 不提供或不要求配置语言/系统(例如 jsonnet),它提供了声明性 API, 该声明性 API 可以由任意形式的声明性规范所构成。RESTful;写yaml文件

  • 不提供也不采用任何全面的机器配置、维护、管理或自我修复系统。

  • 此外,Kubernetes 不仅仅是一个编排系统,实际上它消除了编排的需要。 编排的技术定义是执行已定义的工作流程:首先执行 A,然后执行 B,再执行 C。 相比之下,Kubernetes 包含一组独立的、可组合的控制过程, 这些过程连续地将当前状态驱动到所提供的所需状态。 如何从 A 到 C 的方式无关紧要,也不需要集中控制,这使得系统更易于使用 且功能更强大、系统更健壮、更为弹性和可扩展。

 二. Kubernetes安装

2.1 集群安装规划

node-1:2c 4g,安装master节点

node-2:4c 8g,安装worker节点

node-3:4c 8g,安装worker节点

  Master worker worker
node-1    
node-2    
node-3    

2.2 集群原理

2.2.1 集群架构图

2.2.2 工作原理

master节点(Control Plane【控制面板】):master节点控制整个集群

master节点上有一些核心组件:

  • Controller Manager:控制管理器

  • etcd:键值数据库(redis)【记账本,记事本】

  • scheduler:调度器

  • api server:api网关(所有的控制都需要通过api-server)

node节点(worker工作节点):

  • kubelet(监工):每一个node节点上必须安装的组件。

  • kube-proxy:代理。代理网络

部署一个应用?

程序员:调用CLI告诉master,我们现在要部署一个tomcat应用

  • 程序员的所有调用都先去master节点的网关api-server。这是matser的唯一入口(mvc模式中的c层)

  • 收到的请求先交给master的api-server。由api-server交给controller-mannager进行控制

  • controller-mannager 进行 应用部署

  • controller-mannager 会生成一次部署信息。 tomcat --image:tomcat6 --port 8080 ,真正不部署应用

  • 部署信息被记录在etcd中

  • scheduler调度器从etcd数据库中,拿到要部署的应用,开始调度。看哪个节点合适,

  • scheduler把算出来的调度信息再放到etcd中

  • 每一个node节点的监控kubelet,随时和master保持联系的(给api-server发送请求不断获取最新数据),所有节点的kubelet就会从master

  • 假设node2的kubelet最终收到了命令,要部署。

  • kubelet就自己run一个应用在当前机器上,随时给master汇报当前应用的状态信息,分配ip

  • node和master是通过master的api-server联系的

  • 每一个机器上的kube-proxy能知道集群的所有网络。只要node访问别人或者别人访问node,node上的kube-proxy网络代理自动计算进行流量转发

2.2.3 原理分析

 主节点(master)

快速介绍:

  • master也要装kubelet和kubeproxy

  • 前端访问(UI\CLI):

  • kube-apiserver:

  • scheduler:

  • controller manager:

  • etcd

  • kubelet+kubeproxy每一个节点的必备+docker(容器运行时环境)

工作节点(node)

快速介绍:

  • Pod:

    • docker run 启动的是一个container(容器),容器是docker的基本单位,一个应用是一个容器

    • kubelet run 启动的一个应用称为一个Pod;Pod是k8s的基本单位。

      • Pod是容器的一个再封装

      • atguigu(永远不变) ==slf4j= log4j(类)

      • 应用 ===== ==Pod== ======= docker的容器

      • 一个容器往往代表不了一个基本应用。博客(php+mysql合起来完成)

      • 准备一个Pod 可以包含多个 container;一个Pod代表一个基本的应用。

      • IPod(看电影、听音乐、玩游戏)【一个基本产品,原子】;

      • Pod(music container、movie container)【一个基本产品,原子的】

  • Kubelet:监工,负责交互master的api-server以及当前机器的应用启停等,在master机器就是master的小助手。每一台机器真正干活的都是这个 Kubele

组件交互原理

想让k8s部署一个tomcat?

0、开机默认所有节点的kubelet、master节点的scheduler(调度器)、controller-manager(控制管理器)一直监听master的api-server发来的事件变化(for ::)

 

1、程序员使用命令行工具: kubectl ; kubectl create deploy tomcat --image=tomcat8(告诉master让集群使用tomcat8镜像,部署一个tomcat应用)

2、kubectl命令行内容发给api-server,api-server保存此次创建信息到etcd

3、etcd给api-server上报事件,说刚才有人给我里面保存一个信息。(部署Tomcat[deploy])

4、controller-manager监听到api-server的事件,是 (部署Tomcat[deploy])

5、controller-manager 处理这个 (部署Tomcat[deploy])的事件。controller-manager会生成Pod的部署信息【pod信息】

6、controller-manager 把Pod的信息交给api-server,再保存到etcd

7、etcd上报事件【pod信息】给api-server。

8、scheduler专门监听 【pod信息】 ,拿到 【pod信息】的内容,计算,看哪个节点合适部署这个Pod【pod调度过后的信息(node: node-02)】,

9、scheduler把 【pod调度过后的信息(node: node-02)】交给api-server保存给etcd

10、etcd上报事件【pod调度过后的信息(node: node-02)】,给api-server

11、其他节点的kubelet专门监听 【pod调度过后的信息(node: node-02)】 事件,集群所有节点kubelet从api-server就拿到了 【pod调度过后的信息(node: node-02)】 事件

12、每个节点的kubelet判断是否属于自己的事情;node-02的kubelet发现是他的事情

13、node-02的kubelet启动这个pod。汇报给master当前启动好的所有信息

2.3 集群安装

本次安装采用kubeadm方式安装。

大致流程

  • 准备N台服务器,内网互通

  • 安装Docker容器化环境【k8s放弃dockershim】

  • 安装Kubernetes

    • 三台机器安装核心组件(kubeadm(创建集群的引导工具), kubeletkubectl(程序员用的命令行)

    • kubelet可以直接通过容器化的方式创建出之前的核心组件(api-server)【官方把核心组件做成镜像】

    • 由kubeadm引导创建集群

本次集群安装准备三台裸机就可以,不用安装任何环境。

2.3.1 修改节点hostname

node01


  
  1. # 修改 hostname; k8s-01要变为自己的hostname
  2. hostnamectl set-hostname k8s-01
  3. # 设置 hostname 解析
  4. echo "127.0.0.1 $(hostname)" >> /etc/hosts

node02


  
  1. # 修改 hostname; k8s-01要变为自己的hostname
  2. hostnamectl set-hostname k8s-02
  3. # 设置 hostname 解析
  4. echo "127.0.0.1 $(hostname)" >> /etc/hosts

node03


  
  1. # 修改 hostname; k8s-01要变为自己的hostname
  2. hostnamectl set-hostname k8s-03
  3. # 设置 hostname 解析
  4. echo "127.0.0.1 $(hostname)" >> /etc/hosts

2.3.2 三台机器执行脚本


  
  1. #先在所有机器执行 vi k8s.sh
  2. # 进入编辑模式(输入i),把如下脚本复制
  3. # 所有机器给脚本权限 chmod +x k8s.sh
  4. #执行脚本 ./k8s.sh

k8s.sh脚本


  
  1. #/bin/sh
  2. #######################开始设置环境##################################### \n
  3. printf "##################正在配置所有基础环境信息################## \n"
  4. printf "##################关闭selinux################## \n"
  5. sed -i 's/enforcing/disabled/' /etc/selinux/config
  6. setenforce 0
  7. printf "##################关闭swap################## \n"
  8. swapoff -a
  9. sed -ri 's/.*swap.*/#&/' /etc/fstab
  10. printf "##################配置路由转发################## \n"
  11. cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
  12. br_netfilter
  13. EOF
  14. echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.d/k8s.conf
  15. ## 必须 ipv6流量桥接
  16. echo 'net.bridge.bridge-nf-call-ip6tables = 1' >> /etc/sysctl.d/k8s.conf
  17. ## 必须 ipv4流量桥接
  18. echo 'net.bridge.bridge-nf-call-iptables = 1' >> /etc/sysctl.d/k8s.conf
  19. echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.d/k8s.conf
  20. echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.d/k8s.conf
  21. echo "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.d/k8s.conf
  22. echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.d/k8s.conf
  23. modprobe br_netfilter
  24. sudo sysctl --system
  25. printf "##################配置ipvs################## \n"
  26. cat <<EOF | sudo tee /etc/sysconfig/modules/ipvs.modules
  27. #!/bin/bash
  28. modprobe -- ip_vs
  29. modprobe -- ip_vs_rr
  30. modprobe -- ip_vs_wrr
  31. modprobe -- ip_vs_sh
  32. modprobe -- nf_conntrack_ipv4
  33. EOF
  34. chmod 755 /etc/sysconfig/modules/ipvs.modules
  35. sh /etc/sysconfig/modules/ipvs.modules
  36. printf "##################安装ipvsadm相关软件################## \n"
  37. yum install -y ipset ipvsadm
  38. printf "##################安装docker容器环境################## \n"
  39. sudo yum remove docker*
  40. sudo yum install -y yum-utils
  41. sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  42. yum install -y docker-ce-19.03.9 docker-ce-cli-19.03.9 containerd.io
  43. systemctl enable docker
  44. systemctl start docker
  45. sudo mkdir -p /etc/docker
  46. sudo tee /etc/docker/daemon.json <<- 'EOF'
  47. {
  48. "registry-mirrors": [ "https://061jagel.mirror.aliyuncs.com"]
  49. }
  50. EOF
  51. sudo systemctl daemon-reload
  52. sudo systemctl restart docker
  53. printf "##################安装k8s核心包 kubeadm kubelet kubectl################## \n"
  54. cat <<EOF > /etc/yum.repos.d/kubernetes.repo
  55. [kubernetes]
  56. name=Kubernetes
  57. baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
  58. enabled=1
  59. gpgcheck=0
  60. repo_gpgcheck=0
  61. gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
  62. http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  63. EOF
  64. ###指定k8s安装版本
  65. yum install -y kubelet-1.21.0 kubeadm-1.21.0 kubectl-1.21.0
  66. ###要把kubelet立即启动。
  67. systemctl enable kubelet
  68. systemctl start kubelet
  69. printf "##################下载api-server等核心镜像################## \n"
  70. sudo tee ./images.sh <<- 'EOF'
  71. #!/bin/bash
  72. images=(
  73. kube-apiserver:v1.21.0
  74. kube-proxy:v1.21.0
  75. kube-controller-manager:v1.21.0
  76. kube-scheduler:v1.21.0
  77. coredns:v1.8.0
  78. etcd:3.4.13-0
  79. pause:3.4.1
  80. )
  81. for imageName in ${images[@]} ; do
  82. docker pull registry.cn-wulanchabu.aliyuncs.com/ajw_k8s_images/ $imageName
  83. done
  84. ## 全部完成后重新修改coredns镜像
  85. docker tag registry.cn-wulanchabu.aliyuncs.com/ajw_k8s_images/coredns:v1.8.0 registry.cn-wulanchabu.aliyuncs.com/ajw_k8s_images/coredns/coredns:v1.8.0
  86. EOF
  87. chmod +x ./images.sh && ./images.sh
  88. ### k8s的所有基本环境全部完成

2.3.3 使用kubeadm引导集群

这步操作只在master节点操作


  
  1. #### --apiserver-advertise-address 的地址一定写成自己master机器的ip地址
  2. #### 虚拟机或者其他云厂商给你的机器ip 10.96 192.168
  3. #### 以下的只在master节点执行
  4. kubeadm init \
  5. --apiserver-advertise-address=10.170.2.42 \
  6. --image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
  7. --kubernetes-version v1.21.0 \
  8. --service-cidr=10.96.0.0/16 \
  9. --pod-network-cidr=192.168.0.0/16

这个执行之后,控制台会打印初相对应的日志

2.3.4 master结束以后,按照控制台引导继续往下


  
  1. ## 第一步
  2. mkdir -p $HOME/.kube
  3. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  4. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  5. ##第二步
  6. export KUBECONFIG=/etc/kubernetes/admin.conf
  7. ##第三步 部署网络插件
  8. kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
  9. ##第四步,在其他节点join操作。用控制台打印的kubeadm join 去其他node节点执行
  10. kubeadm join 10.170.11.8:6443 --token cnb7x2.lzgz7mfzcjutn0nk \
  11. --discovery-token-ca-cert-hash sha256:00c9e977ee52632098aadb515c90076603daee94a167728110ef8086d0d5b37d

这个token是有过期时间的,2个小时后就过期了。若过期了


  
  1. ##过期怎么办
  2. kubeadm token create -- print-join-command
  3. kubeadm token create --ttl 0 -- print-join-command
  4. kubeadm join --token y1eyw5.ylg568kvohfdsfco --discovery-token-ca-cert-hash sha256: 6c35e4f73f72afd89bf1c8c303ee55677d2cdb1342d67bb23c852aba2efc7c73

2.3.5 验证集群


  
  1. #等一会,在master节点执行
  2. kubectl get nodes

2.3.6 设置kube-proxy的ipvs模式


  
  1. ##修改kube-proxy默认的配置
  2. kubectl edit cm kube-proxy -n kube-system
  3. ## 修改mode: "ipvs"
  4. ##改完以后重启kube-proxy
  5. ### 查到所有的kube-proxy
  6. kubectl get pod -n kube-system |grep kube-proxy
  7. ### 删除之前的即可
  8. kubectl delete pod 【用自己查出来的kube-proxy-dw5sf kube-proxy-hsrwp kube-proxy-vqv7n】 -n kube-system
  9. ###

所有的pod都running,表示成功。nginx的pod是我自己起的。

三. dashboard部署

https://github.com/kubernetes/dashboard

根据官网提示安装。

3.1 下载yaml

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml

3.2 修改recommended.yaml

为了外网访问,type改为NodePort

3.3 部署

kubectl apply -f ./recommended.yaml 

3.4 查看部署

这两个podrunning状态就可以了。

3.4 登录web

dashboard部署之后,查看service,会有外部暴露的端口。这个端口就是外部访问的端口。https://masterip:30417访问即可。

这里一定要用https访问。用chrom浏览器可能不能进去,进不去的话,推荐用火狐浏览器。

3.5 输入token

找到token,然后输入token。


  
  1. #访问测试
  2. 每次访问都需要令牌
  3. kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

3.6 加入权限

进入dashboard之后,可能会报一些错误,是一些权限的问题。

执行以下命令即可。

创建yaml

vim admin.yaml

admin.yaml内容如下


  
  1. apiVersion: rbac.authorization.k8s.io/v1
  2. kind: ClusterRoleBinding
  3. metadata:
  4. name: kubernetes-dashboard
  5. namespace: kubernetes-dashboard
  6. roleRef:
  7. apiGroup: rbac.authorization.k8s.io
  8. kind: ClusterRole
  9. name: cluster-admin
  10. subjects:
  11. - kind: ServiceAccount
  12. name: kubernetes-dashboard
  13. namespace: kubernetes-dashboard

执行admin.yaml 

kubectl apply -f admin.yml

若执行出错

### 这个要 先kubectl delete -f admin.yaml 再kubectl apply -f admin.yml

访问页面

 

 

 

 


转载:https://blog.csdn.net/qq_29963323/article/details/116146947
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场