【k8s系列001】K8s集群部署H2O
一.k3s集群部署https://docs.rancher.cn/docs/k3s/_indexk3s官网1.安装mastercurl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -2.获取节点和tokenkubectl get nodes//获取节点K3S_TOKEN
一.k3s集群部署
https://docs.rancher.cn/docs/k3s/_index k3s官网
1.安装master
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
2.获取节点和token
kubectl get nodes //获取节点
K3S_TOKEN使用的值存储在你的服务器节点上(master的牡蛎下)的
/var/lib/rancher/k3s/server/node-token
//token
K10a82087509e8605b2aa1c5c6c4d2afbd81ae425a7ae5ffc3f8e50f9c41e06a168::server:b031c62a7da5ec5413622c3092a43b88
3.设置worker节点
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://10.201.2.12:6443 K3S_TOKEN=K10a82087509e8605b2aa1c5c6c4d2afbd81ae425a7ae5ffc3f8e50f9c41e06a168::server:b031c62a7da5ec5413622c3092a43b88 sh -
4.手动设置worker
kubectl label node dev-hwc-gy1-deepexi-datafacts-fastai-other-12-0002 node-role.kubernetes.io/worker=worker
kubectl label node dev-hwc-gy1-deepexi-datafacts-fastai-other-12-0003 node-role.kubernetes.io/worker=worker
5.k3s的原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xlMDeqJP-1637328257748)(https://gitee.com/qinyingjie/pic/raw/master/images/how-it-works-k3s.svg)]
6.master和node
Master 控制节点
apiserver
类似我们给前端提供的api接⼝。
资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制
scheduler
负责决定将Pod放到哪⼀个Node上去运⾏。
controller-manager
管理Cluster中各种资源。资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制
etcd
保存k8s相关的配置信息和状态信息。
如果pod发⽣变化,那么它会迅速通知相关的组件进⾏处理。
Node 工作节点
kubelet
负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器
kube-proxy
负责提供集群内部的服务发现和负载均衡
当service接收到请求后,转发到某个node时,会由该node的kube-proxy负责接收,然后转
发到后端的容器。
如果有多个副本,那么它会实现负载均衡的能⼒。
docker
负责节点上容器的各种操作
Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控
Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行
Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器
Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod
Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签
NameSpace:命名空间,用来隔离pod的运行环境
二.部署h2o集群步骤
k8s集群部署h2o https://www.pavel.cool/h2o-3/h2o-kubernetes-support/
k8s学习 https://blog.csdn.net/pyw1243591908/article/details/103529529
1.搭建k3s集群
2.制作镜像
docker pull h2oai/h2o-open-source-k8s 拉镜像
docker run h2oai/h2o-open-source-k8s 启动
3.编写yaml文件
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: h2o-stateful-set
namespace: h2o-statefulset
spec:
serviceName: h2o-service
replicas: 2
selector:
matchLabels:
app: h2o-k8s
template:
metadata:
labels:
app: h2o-k8s
spec:
terminationGracePeriodSeconds: 10
containers:
- name: h2o-open-source-k8s
image: 'h2oai/h2o-open-source-k8s'
ports:
- containerPort: 54321
protocol: TCP
env:
- name: H2O_KUBERNETES_SERVICE_DNS
value: h2o-service.h2o-statefulset.svc.cluster.local
- name: H2O_NODE_LOOKUP_TIMEOUT
value: '180'
- name: H2O_NODE_EXPECTED_COUNT
value: '2'
---
apiVersion: v1
kind: Service
metadata:
name: h2o-service
namespace: h2o-statefulset
spec:
type: NodePort
selector:
app: h2o-k8s
ports:
- protocol: TCP
port: 54321
nodePort: 30010
targetPort: 54321
4.启动,并访问
5.访问链接
http://10.201.2.13:30010
http://10.201.2.14:30010
http://10.201.2.15:54321
三.常用命令
一定要加上命令空间
1.执行文件
kubectl delete -f h2o.yaml //删除pod和services
kubectl apply -f h2o.yaml //通过yaml部署
kubectl create deployment my-nginx --image nginx:latest //使用命令创建
2.获取全部信息
kubectl get all -n h2o-statefulset //查询所有节点详情
kubectl get pod,svc -o wide -n h2o-statefulset //查看pods和svc详情
3.获取pod信息
kubectl get pods -n h2o-statefulset //查看pods
kubectl describe pod -n h2o-statefulset //查看详情
kubectl get pods -o wide -n h2o-statefulset //查询pod的ip和port
4.获取service信息
kubectl get services -n h2o-statefulset //查看services
kubectl describe service/h2o-service -n h2o-statefulset //查询服务详情
kubectl get services -n default //查询services
5.删除部署
kubectl delete -f h2o.yaml
或者
kubectl delete statefulset.apps/h2o-stateful-set -n h2o-statefulset //删除命名空间
kubectl delete service/h2o-service -n h2o-statefulset //删除services
6.查看controller
kubectl get statefulsets -n h2o-statefulset //查看statefulsets状态
kubectl get deployment //查看所有deployment
7.进入容器内部
kubectl exec -it h2o-stateful-set-0 -n h2o-statefulset --/bin/bash //进入容器内部
kubectl exec -ti h2o-stateful-set-0 -n h2o-statefulset -- /bin/sh //进入容器内部
8.查看节点日志
kubectl logs -f -n h2o-statefulset h2o-stateful-set-0
9.查询服务域名能否可用
nslookup myservice //查询映射服务
nslookup h2o-service.h2o-statefulset.svc.cluster.local //查询服务域名
10.查询命名空间
kubectl get namespace //查询所有命名空间
kubectl get ns #查看k8s上所有的namespace
kubectl create ns pingpang #创建新的namespace "pingpang
11.修改副本数量
kubectl scale deployments/my-nginx --replicas=3 //将副本数修改为3个
kubectl scale sts web --replicas=4 -n nginx-ss #扩容
kubectl scale sts web --replicas=2 -n nginx-ss #缩容
四.Pod status 状态解释
错误英文 | 中文 |
---|---|
CrashLoopBackOff | 容器退出,kubelet正在将它重启 |
InvalidImageName | 无法解析镜像名称 |
ImageInspectError | 无法校验镜像 |
ErrImageNeverPull | 策略禁止拉取镜像 |
ImagePullBackOff | 镜像正在重试拉取 |
RegistryUnavailable | 连接不到镜像中心 |
ErrImagePull | 通用的拉取镜像出错 |
CreateContainerConfigError | 不能创建kubelet使用的容器配置 |
CreateContainerError | 创建容器失败 |
m.internalLifecycle.PreStartContainer | 执行hook报错 |
RunContainerError | 启动容器失败 |
PostStartHookError | 执行hook报错 |
ContainersNotInitialized | 容器没有初始化完毕 |
ContainersNotReady | 容器没有准备完毕 |
ContainerCreating | 容器创建中 |
PodInitializing | pod 初始化中 |
DockerDaemonNotReady | docker还没有完全启动 |
NetworkPluginNotReady | 网络插件还没有完全启动 |
五.安 装 minikube
设置阿里云镜像
vim /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
安装minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
安装kubectl
curl -LO https://dl.k8s.io/release/v1.20.0/bin/linux/amd64/kubectl
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
安装conntrack
yum install
启动minikube
minikube start --vm-driver=none --image-mirror-country='cn'
停止minikube
minikube stop
六.重要概念
Cluster——是计算、存储和网络资源的集合
Master——Cluster的大脑,决定将应用放在哪里运行
Node——职责是运行容器应用
Pod——k8s的最小工作单元,包含1orN个容器。
Controller——k8s通过它来管理Pod
包含:Deployment、ReplicaSet、DaemonSet、StatefulSet、Job
Service——为Pod提供了负载均衡、固定的IP和Port
Namespace——解决同一个Cluster中,如何区别分开Controller、Pod等资源的问题
Kubernetes的系统组件都被放到kube-system的namespace中。
kubelet是唯一没有以容器形式运行的Kubernetes组件。
七.工作流程
当我们执行部署应用并指定两个副本的时候,执行流程如下所示:
1> Kuberctl发送部署请求到API Server。
2> API Server通知Controller Manager创建一个deployment资源。
3> Scheduler执行调度任务,将两个副本Pod分发到node1和node2上。
4> node1和node2上的kubectl在各自的节点上创建并运行Pod。
八.k8s容器
九.滚动更新
十.相关图片
十一.转发K8S后端服务的四种方式
- ClusterIP
- NodePort
- loadbalance
- Ingress
十二.k8s中的port
nodePort //外部机器可访问的端口。
targetPort //容器的端口(最根本的端口入口)
port //kubernetes中的服务之间访问的端口
十三.k8s的核心功能
kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:
- 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
- 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
- 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
- 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
- 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
- 存储编排:可以根据容器自身的需求自动创建存储卷
十四.为什么使用k8s
k8s是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
1、故障迁移:当某一个node节点关机或挂掉后,node节点上的服务会自动转移到另一个node节点上,这个过程所有服务不中断。这是docker或普通云主机是不能做到的
2、资源调度:当node节点上的cpu、内存不够用的时候,可以扩充node节点,新建的pod就会被kube-schedule调度到新扩充的node节点上
3、资源隔离:创建开发、运维、测试三个命名空间,切换上下文后,开发人员就只能看到开发命名空间的所有pod,看不到运维命名空间的pod,这样就不会造成影响,互不干扰
传统的主机或只有docker环境中,登录进去就会看到所有的服务或者容器
4、因为采用docker容器,进程之间互不影响,
5、安全:不同角色有不同的权限,查看pod、删除pod等操作;RBAC认证增加了k8s的安全
快速精准地部署应用程序
- 限制硬件用量仅为所需资源
Kubernetes 的优势
- 可移动: 公有云、私有云、混合云、多态云
- 可扩展: 模块化、插件化、可挂载、可组合
- 自修复: 自动部署、自动重启、自动复制、自动伸缩
k8s可以更快的更新新版本,打包应用,更新的时候可以做到不用中断服务,服务器故障不用停机,从开发环境到测试环境到生产环境的迁移极其方便,一个配置文件搞定,一次生成image,到处运行。。。
更多推荐
所有评论(0)