一.简介
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
访问页面
转载:https://blog.csdn.net/qq_29963323/article/details/116146947