k8s-基础篇
搭建k8s环境
Myapp镜像部署
扩容pod
自愈
负载均衡
DNS
外网访问
滚动更新
YAML方式部署
独立部署pod
RS副本控制器
Deployment-自动扩容
Deployment-更新版本
Deployment-回滚版本
daemonset
job
cronJob
初始化容器
链接:https://pan.baidu.com/s/1U_AWBEXsjESZ2eDPIH4TFA
提取码:gmze
网盘里有一些配置文件和系统组件可以自行下载使用。环境搭建很麻烦,如果发现失败可与我联系或按照文档重试几次。以下步骤是完全可用的!
搭建k8s环境
环境准备
环境3台centos虚拟机每台虚拟机2核2G,一个master两个node。搭建k8s环境如没有特殊说明所有操作均在三个节点同时操作。
部署docker
kubeadm[一键安装k8s]
集群安装
网盘中有镜像文件kubeadm-basic.images
k8s部署
flflannel插件
节点Join
节点加入需要token和sha256,在主节点上执行以下命令获取。
创建token
kubeadm token create
m9rrtc.2cm48k5w6ymsprwt
查看token可能有多个,选择一个没有过期的即可
kubeadm token list
获取 CA 证书 sha256 编码 hash 值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
4a77cfd6f9e2a16a7a45351369275f102b9986b469d3f9f9865a87050e4bf0dc
在子节点执行以下命令
kubeadm join 主机IP:6443 --token 59mzkj.26xap2hzdhm74ptq --discovery-token-ca-cert-hash sha256:18acdb7c02c6ea696307fde451f44ea0d216e6ccb6777a2a87002d7d45f3845c
在主节点查看。我这里node2虚拟机关闭了,电脑不行。正常情况下都是Ready


Myapp镜像部署
需要在master和node上配置docker镜像。
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors?accounttraceid=0cd89c7411274ee48cb11fad06368ba3fxyw

创建pod(部署服务) : kubectl run myapp --image=ikubernetes/myapp:v1 --port=80 --replicas=2 (replicas指定pod数量默认1)
查询pod创建详细信息: kubectl describe pod myapp-554864fdf4-f4gw9
查询pod: kubectl get pod
查询pod详细信息: kubectl get pod -o





Kubectl run 首先创建deployment对象,kubectl run 指令执行后创建了3个资源对象(deployment,rs,pod)
注意: 上面这条指令没有指定副本数量,默认创建了1个pod。如果只有master节点则创建失败,至少有一个node
如果要删除彻底删除pod需要先删除deployment,然后pod会自动删除。
kubectl delete deployment myapp

扩容pod

kubectl scale deployment myapp --replicas=4

也可以再次缩容

自愈
K8s管理的pod不仅仅可以一键式部署,一键式扩容,同时k8s管理的pod还具有自愈能力。也就是说当pod发生故障,宕机,k8s将会自动对pod件重建,因此k8s的pod的副本永远处于高可用状态。
删除所有的pod,查看pod是否还存在: kubectl delete pod –all

负载均衡

Pod有多个副本,访问pod副本必须实现负载均衡访问,那么这个负载均衡访问是通过service来实现的。因此对一组pod副本创建一个service,进行负载均衡
对一组pod副本创建service: kubectl expose deployment myapp --port=30000 --target-port=80
kubectl get svc


通过测试发现,k8s默认使用轮训策略。
kubectl delete svc/myapp 删除service

DNS
安装k8s时候,安装dns组件,dns(域名解析服务器,根据域名解析出真实ip地址,通过dns可以通过服务名进行相互的访问)
在容器内部通过服务名访问其他容器
kubectl exec -it myapp-554864fdf4-wsr7h -- sh

wget myapp:30000(service名称) --- 测试通过,说明可以通过服务名称,访问到外部网络,因此dns服务器是ok的。




外网访问
Service 和pod 之间的通信都属于局域网通信访问。无法对外网直接提供服务,service是一个虚拟化的概念,是一个虚拟IP地址,没有与之对应的物理硬件资料,无法直接对外网提供服务,必须借助于物理硬件资源进行数据包转发。
kubectl edit svc myapp --- 编辑service对应资源对象配置文件,通过修改ip类型,来绑定物理端口。



可以发现32727就是我们所开辟物理端口,此端口可以在配置文件中自定义,也可以默认即可,默认端口范围:30000 – 32767
滚动更新
项目迭代,不停的发布新的版本,如何实现不停机更新。一键式更新操作.滚动更新,发现访问时候,已经是v2版本的服务.原来的pod开始没有关闭
等到新版本的pod发布后才把老版本删除。

YAML方式部署
通过yaml配置文件方式一键部署服务。yaml的详细配置在网盘连接里有。YAML语法规范.md
现在我们要部署一个Nginx服务,先拉去一个docker镜像,其实可以让k8s自己下载,但是我要给Nginx打一个tag
docker pull nginx


编写yaml文件在网盘链接中有

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: mynginx
release: stable
env: test
template:
metadata:
labels:
app: mynginx
release: stable
env: test
spec:
containers:
- name: my-nginx
image: nginx:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
kubectl apply -f nginx-deploy.yaml 执行脚本

编写service.yaml

apiVersion: v1
kind: Service
metadata:
name: nginx-svc
namespace: default
spec:
type: NodePort
selector:
app: mynginx
release: stable
env: test
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30003


独立部署pod
自主式的pod: 单独定义一个pod,这个没有没有副本控制器管理,也没有对应deployment,可以直接删除pod并且不会自愈。

apiVersion: v1
kind: Pod
metadata:
name: init-pod
labels:
app: myapp
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
kubectl apply -f init-pod.yaml 执行脚本

RS副本控制器
ReplicationController (RC)用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收;
在新版本的Kubernetes中建议使用Replicaset来取代ReplicationController. ReplicaSet跟 ReplicationController没有本质的不同,只是名字不一样,并且ReplicaSet支持集合式的selector;

apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1

pod删除后可以自愈

修改pod的标签后pod就会脱离RS而RS也会重新生成一个pod

删除副本控制器后pod也会删除

Deployment-自动扩容
Deployment可以保证在升级时只有一定数量的Pod是down的。默认的,它会确保至少有比期望的Pod数量少一个是up状态(最多一个不可用)
Deployment同时也可以确保只创建出超过期望数量的一定数量的Pod,默认的,它会确保最多比期望的Pod数量多一个的Pod是up的(最多1个surge )

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1

kubectl autoscale deployment nginx-deployment --min=2 --max=5 --cpu-percent=80
这条指令是说最少两个pod最多5个单个pod的cpu使用率达到80则创建副本。

Deployment-更新版本
kubectl set image deployment appdeployment(deployment名称) nginx(container名称)=ikubernetes/myapp:v2(要更新的镜像)



Deployment-回滚版本
kubectl rollout undo deployment appdeployment(deployment名称)
daemonset
确保只运行一个副本,运行在集群中每一个节点上。而deployment可能只将pod运行在一个节点上。daemonset没有RS

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: my-deamon
namespace: default
labels:
app: daemonset
spec:
selector:
matchLabels:
app: my-daemonset
template:
metadata:
labels:
app: my-daemonset
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1


job
job负责处理任务,即仅执行一次的任务,下面这个job从仓库拉去一个镜像,执行一个循环打印。

apiVersion: batch/v1
kind: Job
metadata:
name: job-demo
spec:
template:
metadata:
name: job-demo
spec:
restartPolicy: Never
containers:
- name: counter
image: busybox
command:
- "bin/sh"
- "-c"
- "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"

cronJob
cronJob其实就是在`Job`的基础上加上了时间调度,我们可以:在给定的时间点运行一个任务,也可以周期性地在给定时间点运行。
以下配置是1分钟创建一个job执行

apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-demo
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: hello
image: busybox
args:
- "bin/sh"
- "-c"
- "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
初始化容器
Pod能够持有多个容器,应用运行在容器里面,但是它也可能有一个或多个先于应用容器启动的Init容器。Init容器与普通的容器非常像,除了如下两点:1 Init容器总是运行到成功完成为止 2 每个Init容器都必须在下一个Init容器启动之前成功完成
如果Pod的Init容器失败,Kubernetes会不断地重启该Pod,直到Init容器成功为止。然而,如果Pod对应的restartPolicy为Never,它不会重新启动。
以下配置为初始化容器休眠2分钟后创建。然后应用容器才会创建

apiVersion: v1
kind: Pod
metadata:
name: init-pod
labels:
app: myapp
spec:
containers:
- name: myapp
image: nginx
initContainers:
- name: init-mydb
image: nginx
command: ['sh', '-c', 'echo -n "running at " && date +%T && sleep 120']


k8s-基础篇的更多相关文章
- docker+k8s基础篇五
Docker+K8s基础篇(五) service资源介绍 A:service资源的工作特性 service的使用 A:service字段介绍 B:ClusterIP的简单使用 C:NodePort的简 ...
- docker+k8s基础篇四
Docker+K8s基础篇(四) pod控制器 A:pod控制器类型 ReplicaSet控制器 A:ReplicaSet控制器介绍 B:ReplicaSet控制器的使用 Deployment控制器 ...
- docker+k8s基础篇三
Docker+K8s基础篇(三) kubernetes上的资源 A:k8s上的常用资源 Pod的配置清单 A:Pod上的清单定义 B:Pod创建资源的方法 C:spec下其它字段的介绍 Pod的生命周 ...
- docker+k8s基础篇二
Docker+K8s基础篇(二) docker的资源控制 A:docker的资源限制 Kubernetes的基础篇 A:DevOps的介绍 B:Kubernetes的架构概述 C:Kubernetes ...
- docker+k8s基础篇一
Docker+K8s基础篇(一) docker的介绍 A:为什么是docker B:k8s介绍 docker的使用 A:docker的安装 B:docker的常用命令 C:docker容器的启动和操作 ...
- ASP.NET Core on K8S深入学习(1)K8S基础知识与集群搭建
在上一个小系列文章<ASP.NET Core on K8S学习初探>中,通过在Windows上通过Docker for Windows搭建了一个单节点的K8S环境,并初步尝试将ASP.NE ...
- 掌握SpringBoot-2.3的容器探针:基础篇
欢迎访问我的GitHub 地址:https://github.com/zq2599/blog_demos 内容:原创文章分类汇总,及配套源码,涉及Java.Docker.K8S.DevOPS等 关于& ...
- 好未来数据中台 Node.js BFF实践(一):基础篇
好未来数据中台 Node.js BFF实践系列文章列表: 基础篇 实战篇(TODO) 进阶篇(TODO) 好未来数据中台的Node.js中间层从7月份开始讨论可行性,截止到9月已经支持了4个平台,其中 ...
- C#多线程之基础篇3
在上一篇C#多线程之基础篇2中,我们主要讲述了确定线程的状态.线程优先级.前台线程和后台线程以及向线程传递参数的知识,在这一篇中我们将讲述如何使用C#的lock关键字锁定线程.使用Monitor锁定线 ...
- 一步步学习javascript基础篇(0):开篇索引
索引: 一步步学习javascript基础篇(1):基本概念 一步步学习javascript基础篇(2):作用域和作用域链 一步步学习javascript基础篇(3):Object.Function等 ...
随机推荐
- spoj - ACTIV - Activities
ACTIV - Activities Ana likes many activities. She likes acrobatics, alchemy, archery, art, Arabic da ...
- 1076 - Get the Containers
1076 - Get the Containers PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 ...
- Codeforces 876B:Divisiblity of Differences(数学)
B. Divisiblity of Differences You are given a multiset of n integers. You should select exactly k of ...
- 【机器学*】k*邻算法-02
k邻*算法具体应用:2-2约会网站配对 心得体会: 1.对所有特征值进行归一化处理:将特征值单位带来的距离影响消除,使所有特征同权重--然后对不同的特征进行加权2.对于相互独立的特征,可以通过建立(特 ...
- 编写Java程序,实现对兵营类的封装,将兵营类中的所有属性设置为私有访问权限,方法设置为公有访问权限
返回本章节 返回作业目录 需求说明: 实现对兵营类的封装 将兵营类中的所有属性设置为私有访问权限. 将兵营类中所有属性的赋值方法设置为公有访问权限. 要求兵营名称的长度在4-8位之间. 要求兵营士兵的 ...
- 编写Java程序,实现控制台版的省市联动
返回本章节 返回作业目录 需求说明: 系统显示用户所有直辖市的名称,用户在控制台输入直辖市的名称,即可在控制台中显示该直辖市所管辖的所有区的名称. 实现思路: 创建省市联动类ProvincialLin ...
- 编写Java程序,模拟教练员和运动员出国比赛场景,其中运动员包括乒乓球运动员和篮球运动员。教练员包括乒乓球教练和篮球教练。为了方便出国交流,根乒乓球相关的人员都需要学习英语。
需求说明: 模拟教练员和运动员出国比赛场景,其中运动员包括乒乓球运动员和篮球运动员.教练员包括乒乓球教练和篮球教练.为了方便出国交流,根乒乓球相关的人员都需要学习英语.具体分析如下: (1)共同的属性 ...
- C#WPF数据绑定模板化操作四步走
前言:WPF数据绑定对于WPF应用程序来说尤为重要,本文将讲述使用MVVM模式进行数据绑定的四步走用法: 具体实例代码如下: 以下代码仅供参考,如有问题请在评论区留言,谢谢 1 第一步:声明一个类用来 ...
- Java中List与数组互相转换
1.说明 在Java中,经常遇到需要List与数组互相转换的场景. List转换成数组,可以使用List的toArray()或者toArray(T[] a)方法. 数组转换成List,可以使用Arra ...
- Maven常用参数说明
缩写 全名 说明 -h --help 显示帮助信息 -am --also-make 构建指定模块,同时构建指定模块依赖的其他模块 -amd --also-make-dependents 构建指定模块, ...


