阅读 180

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

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

一.简介

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(创建集群的引导工具), kubelet,kubectl(程序员用的命令行) )


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


由kubeadm引导创建集群


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


2.3.1 修改节点hostname

node01


# 修改 hostname;  k8s-01要变为自己的hostname

hostnamectl set-hostname k8s-01

 

# 设置 hostname 解析

echo "127.0.0.1   $(hostname)" >> /etc/hosts

node02


# 修改 hostname;  k8s-01要变为自己的hostname

hostnamectl set-hostname k8s-02

 

# 设置 hostname 解析

echo "127.0.0.1   $(hostname)" >> /etc/hosts

node03


# 修改 hostname;  k8s-01要变为自己的hostname

hostnamectl set-hostname k8s-03

 

# 设置 hostname 解析

echo "127.0.0.1   $(hostname)" >> /etc/hosts

2.3.2 三台机器执行脚本

#先在所有机器执行 vi k8s.sh

# 进入编辑模式(输入i),把如下脚本复制

# 所有机器给脚本权限  chmod +x k8s.sh

#执行脚本 ./k8s.sh

k8s.sh脚本


#/bin/sh

 

#######################开始设置环境##################################### \n

 

 

printf "##################正在配置所有基础环境信息################## \n"

 

 

printf "##################关闭selinux################## \n"

sed -i 's/enforcing/disabled/' /etc/selinux/config

setenforce 0

printf "##################关闭swap################## \n"

swapoff -a  

sed -ri 's/.*swap.*/#&/' /etc/fstab 

 

printf "##################配置路由转发################## \n"

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf

br_netfilter

EOF

echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.d/k8s.conf

 

## 必须 ipv6流量桥接

echo 'net.bridge.bridge-nf-call-ip6tables = 1' >> /etc/sysctl.d/k8s.conf

## 必须 ipv4流量桥接

echo 'net.bridge.bridge-nf-call-iptables = 1' >> /etc/sysctl.d/k8s.conf

echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.d/k8s.conf

echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.d/k8s.conf

echo "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.d/k8s.conf

echo "net.ipv6.conf.all.forwarding = 1"  >> /etc/sysctl.d/k8s.conf

modprobe br_netfilter

sudo sysctl --system

printf "##################配置ipvs################## \n"

cat <<EOF | sudo tee /etc/sysconfig/modules/ipvs.modules

#!/bin/bash

modprobe -- ip_vs

modprobe -- ip_vs_rr

modprobe -- ip_vs_wrr

modprobe -- ip_vs_sh

modprobe -- nf_conntrack_ipv4

EOF

 

chmod 755 /etc/sysconfig/modules/ipvs.modules 

sh /etc/sysconfig/modules/ipvs.modules

 

 

printf "##################安装ipvsadm相关软件################## \n"

yum install -y ipset ipvsadm

 

 

 

 

printf "##################安装docker容器环境################## \n"

sudo yum remove docker*

sudo yum install -y yum-utils

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install -y docker-ce-19.03.9  docker-ce-cli-19.03.9 containerd.io

systemctl enable docker

systemctl start docker

 

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'

{

  "registry-mirrors": ["https://061jagel.mirror.aliyuncs.com"]

}

EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

 

 

printf "##################安装k8s核心包 kubeadm kubelet kubectl################## \n"

cat <<EOF > /etc/yum.repos.d/kubernetes.repo

[kubernetes]

name=Kubernetes

baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64

enabled=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-key.gpg

EOF

 

###指定k8s安装版本

yum install -y kubelet-1.21.0 kubeadm-1.21.0 kubectl-1.21.0

 

###要把kubelet立即启动。

systemctl enable kubelet

systemctl start kubelet

 

printf "##################下载api-server等核心镜像################## \n"

sudo tee ./images.sh <<-'EOF'

#!/bin/bash

images=(

kube-apiserver:v1.21.0

kube-proxy:v1.21.0

kube-controller-manager:v1.21.0

kube-scheduler:v1.21.0

coredns:v1.8.0

etcd:3.4.13-0

pause:3.4.1

)

for imageName in ${images[@]} ; do

docker pull registry.cn-wulanchabu.aliyuncs.com/ajw_k8s_images/$imageName

done

## 全部完成后重新修改coredns镜像

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

EOF

   

chmod +x ./images.sh && ./images.sh

   

### k8s的所有基本环境全部完成

2.3.3 使用kubeadm引导集群

这步操作只在master节点操作


#### --apiserver-advertise-address 的地址一定写成自己master机器的ip地址

#### 虚拟机或者其他云厂商给你的机器ip  10.96  192.168

#### 以下的只在master节点执行

kubeadm init \

--apiserver-advertise-address=10.170.2.42 \

--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \

--kubernetes-version v1.21.0 \

--service-cidr=10.96.0.0/16 \

--pod-network-cidr=192.168.0.0/16

 

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


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

## 第一步

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

 

##第二步

export KUBECONFIG=/etc/kubernetes/admin.conf

 

##第三步 部署网络插件

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

 

##第四步,在其他节点join操作。用控制台打印的kubeadm join 去其他node节点执行

kubeadm join 10.170.11.8:6443 --token cnb7x2.lzgz7mfzcjutn0nk \

--discovery-token-ca-cert-hash sha256:00c9e977ee52632098aadb515c90076603daee94a167728110ef8086d0d5b37d

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


##过期怎么办

kubeadm token create --print-join-command

kubeadm token create --ttl 0 --print-join-command

kubeadm join --token y1eyw5.ylg568kvohfdsfco --discovery-token-ca-cert-hash sha256: 6c35e4f73f72afd89bf1c8c303ee55677d2cdb1342d67bb23c852aba2efc7c73

2.3.5 验证集群

#等一会,在master节点执行

kubectl get nodes



2.3.6 设置kube-proxy的ipvs模式

##修改kube-proxy默认的配置

kubectl edit cm kube-proxy -n kube-system

## 修改mode: "ipvs"

 

##改完以后重启kube-proxy

### 查到所有的kube-proxy

kubectl get pod -n kube-system |grep kube-proxy

### 删除之前的即可

kubectl delete pod 【用自己查出来的kube-proxy-dw5sf kube-proxy-hsrwp kube-proxy-vqv7n】  -n kube-system

 

###



所有的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。


#访问测试

每次访问都需要令牌

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内容如下


apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRoleBinding

metadata:

  name: kubernetes-dashboard

  namespace: kubernetes-dashboard

roleRef:

  apiGroup: rbac.authorization.k8s.io

  kind: ClusterRole

  name: cluster-admin

subjects:

  - kind: ServiceAccount

    name: kubernetes-dashboard

    namespace: kubernetes-dashboard

执行admin.yaml 


kubectl apply -f admin.yml

若执行出错



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

访问页面




 


 

————————————————

版权声明:本文为CSDN博主「New灬soul」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_29963323/article/details/116146947


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐