从零开始学习k8s
文章目录[1] kubernetes 概述[1.1] kubernetes 是什么[1.2] kubernetes 特性[1.3] kubernetes 集群架构与组件[1.4] kubernetes核心概念[2] kubernetes集群部署[2.1.官方提供的三种部署方式 ][2.2.Kubernetes平台环境规划 ][2.3.自签SSL证书][2.4.Etcd数据库集群部署][2.5. N
文章目录
[1] kubernetes 概述
[1.1] kubernetes 是什么
[1.2] kubernetes 特性
[1.3] kubernetes 集群架构与组件
[1.4] kubernetes核心概念
[2] kubernetes集群部署
[2.1.官方提供的三种部署方式 ]
[2.2.Kubernetes平台环境规划 ]
[2.3.自签SSL证书]
[2.4.Etcd数据库集群部署]
[2.5. Node安装Docker]
[2.6.部署Kubernetes网络]
[2.7.部署Master组件]
[2.8.部署Node组件]
[2.9.部署一个测试示例]
[2.10.部署Web UI(Dashboard)]
[2.11.部署集群内部DNS解析服务(CoreDNS)]
[3] kubectl命令行管理工具
3.1.[kubectl管理命令概要]
3.2.[kubectl管理应用程序生命周期]
3.3[kubectl远程连接K8S集群]
[4] 深入理解Pod对象
4.1. [Pod容器分类]
4.2. [镜像拉取策略]
#镜像有三种拉取策略:
• IfNotPresent:默认值,镜像在宿主机上不存在时才拉取
• Always:每次创建 Pod 都会重新拉取一次镜像
• Never: Pod 永远不会主动拉取这个镜像
1、配置镜像拉取策略为默认,配置镜像拉取地址
spec:
containers:
- image: nginx:1.17
imagePullPolicy: IfNotPresent
imagePullSecrets:
- name: myregistrykey
#
#创建镜像拉取的凭证
kubectl create secret docker-registry myregistrykey --docker-username=admin --docker-password=Harbor12345 --docker-email=admin@163.com --docker-server="148.153.22.12"
secret/myregistrykey created
#查看镜像拉取的认证文件
[root@master ~]# kubectl get secret
myregistrykey
4.3. [资源限制]
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: db
image: mysql:5.7
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- name: wp
image: wordpress
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
以上是搭建的wordpress,并做了cpu和内存的限制
4.4. [重启策略]
• Always:当容器终止退出后,总是重启容器,默认策略。
• OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。
• Never:当容器终止退出,从不重启容器。
apiVersion: v1
kind: Pod
metadata:
name: my-deploy2
spec:
nodeSelector:
env_role: dev
containers:
- name: my-deploy2
image: nginx
restartPolicy: Always
status: {}
4.5. [健康检查Probe]
Probe有以下两种类型:
livenessProbe
如果检查失败,将杀死容器,根据Pod的restartPolicy来操作。
readinessProbe
如果检查失败,Kubernetes会把Pod从service endpoints中剔除。
Probe支持以下三种检查方法:
httpGet
发送HTTP请求,返回200-400范围状态码为成功。
exec
执行Shell命令返回状态码是0为成功。
tcpSocket
发起TCP Socket建立成功
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: k8s.gcr.io/busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
探测的方法是:通过 cat 命令检查 /tmp/healthy 文件是否存在。如果命令执行成功,返回值为零,Kubernetes 则认为本次 Liveness 探测成功;如果命令返回值非零,本次 Liveness 探测失败。
initialDelaySeconds: 5 指定容器启动 5 之后开始执行 Liveness 探测,我们一般会根据应用启动的准备时间来设置。比如某个应用正常启动要花 30 秒,那么 initialDelaySeconds 的值就应该大于 30。
periodSeconds: 5 指定每 5 秒执行一次 Liveness 探测。Kubernetes 如果连续执行 3 次 Liveness 探测均失败,则会杀掉并重启容器。
具体后面再yml里再详细介绍!
详情参考此文:https://blog.csdn.net/wenjianfeng/article/details/93370906
4.6. [调度流程与调度约束]
k8s各个组件与api-server通过list-watch机制通信
解释上图:
用户会把创建pod任务交给apiserver,apiserver会写入etcd中,etcd存储完成,apiserver会响应一个事件,scheduler会通过watch机制获取到这个事件,并根据调度算法选出绑定的node并返回给apiserver,apiserver把事件和数据写到etcd中,kubelet在node节点上会监听到此事件,并和pod做绑定,随即调用docker创建pod,创建完成后kubelet会获取到pod 的状态,并将此信息反馈apiserver,apiserver将此信息写到etcd中。
#查看node
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
10.240.13.4 Ready <none> 8d v1.13.4
10.240.13.5 Ready <none> 7d23h v1.13.4
#为node打上相关标签
kubectl label nodes 10.240.13.4 env_role=dev
kubectl label nodes 10.240.13.5 env_role=prod
#查看node的标签
kubectl get nodes --show-labels
#创建pod
vim my_pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-deploy
spec:
nodeSelector:
env_role: dev
containers:
- name: my-deploy
image: nginx
status: {}
#执行创建
kubectl apply -f my_pod.yaml
#查看
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-deploy 1/1 Running 0 16m 172.17.28.3 10.240.13.4 <none> <none>
4.7. [故障排查]
pod已经创建到kubernetes,在创建过程中是 pending状态
pod已经绑定到一个节点,并创建所有容器,至少一个运行,running状态
pod中所有容器都已终止,不会重新启动,successed状态
pod的所有容器均已终止,容器以非0状态退出 failed状态
未知 unknown状态
kubectl describe pod/nginx-7cccd4bdff-9d797 #pod信息,和详细事件
kubectl logs pod/nginx-7cccd4bdff-9d797 #通过logs查看pod的日志
kubectl exec -it nginx-7cccd4bdff-9d797 bash #通过exec 进入pod容器的 bash控制台
[5] 控制器
前言 Pod与controllers的关系
- controllers:在集群上管理和运行容器的对象
- 通过label-selector相关联
- Pod通过控制器实现应用的运维,如伸缩,升级等
5.1. [Deployment]
部署无状态应用
管理Pod和ReplicaSet
具有上线部署、副本设定、滚动升级、回滚等功能
提供声明式更新,例如只更新一个新的Image
应用场景:Web服务、微服务
apiVersion: apps/v1beta2 #版本
kind: Deployment #资源对象名称
metadata: #元数据,指定deployment 名称,命名空间,标签
labels:
app: nginx
name: nginx
spec: #具体控制器和容器的选项配置
replicas: 3 #副本数量
selector: #选择器
matchLabels: # 匹配标签,
app: nginx
template: #模板
metadata: #pod的元数据
labels: #pod的标签
app: nginx #标签名
spec: #控制器
containers: #设置容器
- name: nginx #容器名
image: nginx:1.10 #镜像
ports: #端口
- containerPort: 80 #80
#复制粘贴请注意格式
5.2. [StatefulSet]
5.3. [DaemonSet]
在每个Node上运行一个Pod
新加入的Node也同样会自动运行一个Pod
应用场景:Agent
apiVersion: apps/v1beta2 #版本
kind: DaemonSet #资源对象名称
metadata: #元数据,指定deployment 名称,命名空间,标签
name: agent
namespace: default
spec: #具体控制器和容器的选项配置
selector: #选择器
matchLabels: # 匹配标签,
app: agent
template: #模板
metadata: #pod的元数据
labels: #pod的标签
app: agent #标签名
spec: #控制器
containers: #设置容器
- name: nginx #容器名
image: nginx:1.10 #镜像
ports: #端口
- containerPort: 80 #80
[root@master k8s-config]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
agent-59q4c 1/1 Running 0 30m 172.17.30.11 10.240.13.5 <none> <none>
agent-ptb6n 1/1 Running 0 30m 172.17.28.2 10.240.13.4 <none> <none>
#可以看到agent 已经在各个node创建了
5.4. [Job]
Job分为普通任务(Job)和定时任务(CronJob)
一次性执行
应用场景:离线数据处理,视频解码等业务
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
5.5. [CronJob]
定时任务,像Linux的Crontab一样。
• 定时任务
应用场景:通知,备份
vim CronJob.yml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
#可以看到hello已经打印
[5.6] 配置管理
- Secert
加密数据存放在ETCD中,让Pod容器以挂载Volume方式访问
Pod使用secret两种方式:
变量注入
挂载
应用场景:凭据,认证信息
变量注入方式 vim Secert-vol.yml
apiVersion: v1
kind: Secret
metadata:
creationTimestamp: 2016-01-22T18:41:56Z
name: mysecret
namespace: default
resourceVersion: "164619"
uid: cfee02d6-c137-11e5-8d73-42010af00002
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
---
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
测试方法:
1、登录到pod里
kubectl exec -it mypod bash
2、输入以下命令可以查看在上面注入的变量
echo $SECRET_USERNAME
echo $SECRET_PASSWORD
挂载,让pod容器以挂载volume的方式访问 vim secert-path.yml
apiVersion: v1
kind: Secret
metadata:
creationTimestamp: 2016-01-22T18:41:56Z
name: mysecret
namespace: default
resourceVersion: "164619"
uid: cfee02d6-c137-11e5-8d73-42010af00002
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
---
apiVersion: v1
kind: Pod
metadata:
name: mypod2
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
测试:
1、登录到pod里
kubectl exec -it mypod bash
2、输入以下命令可以查看挂载的文件
cat /etc/foo/username
cat /etc/foo/password
- Configmap
apiVersion: v1
kind: ConfigMap
metadata:
name: myconfig
namespace: default
data:
special.level: info
special.type: hello
---
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: busybox
image: busybox
command: [ "/bin/sh", "-c", "echo $(LEVEL) $(TYPE)" ]
env:
- name: LEVEL
valueFrom:
configMapKeyRef:
name: myconfig
key: special.level
- name: TYPE
valueFrom:
configMapKeyRef:
name: myconfig
key: special.type
restartPolicy: Never
---
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-config
data:
redis.properties: |
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
---
apiVersion: v1
kind: Pod
metadata:
name: mypod2
spec:
containers:
- name: busybox
image: busybox
command: [ "/bin/sh","-c","cat /etc/config/redis.properties" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: redis-config
restartPolicy: Never
测试:
1、
[root@master k8s-config]# kubectl logs mypod2
redis.host=127.0.0.1
redis.port=6379
redis.password=123456
[root@master k8s-config]# kubectl logs mypod
info hello
[5.7] Service - 与外界连通
service存在的意义
防止Pod关联(服务发现)
定义一组Pod的访问策略(负载均衡)
支持ClusterIP,NodePort以及loadBalancer三种类型
service的底层实现主要有iptables和ipvs二种网络模式
5.7.1 Pod与Service的关系
通过label-selector相关联
通过service实现pod的负载均衡(TCP/udp 4层)
5.7.2 Service类型
5.7.3 Service代理模式
iptables
灵活,功能强大
规则遍历匹配和更新,呈线性时延
可扩展性
IPVS
工作在内核态,有更好的性能
调度算法丰富: rr,wrr,lc,wlc,ip hash等等
nodeport 访问流程
client > lb(api-server) > nodeport/service > iptables/ipvs >pod >container
5.7.4 DNS
DNS服务监视Kubernetes API,为每一个Service创建DNS记录用于域名解析。
ClusterIP A记录格式:..svc.cluster.local
示例:my-svc.my-namespace.svc.cluster.local
https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns/coredns #参考此文档
将此文件内容复制到coredns.yaml文件
使用 kubectl apply -f coredns.yaml 创建
使用kubectl get pods -n kube-system 查看
5.8 Ingress
5.8.1 Pod与Ingress的关系
ingress访问流程
client > lb > ingress controller(nginx) > service > pod >container
通过label-selector相关联
通过Ingress Controller实现Pod的负载均衡
- 支持TCP/UDP 4层和HTTP 7层
5.8.2 Ingress Controller
部署文档:https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md
注意事项:
• 镜像地址修改成国内的:lizhenliang/nginx-ingress-controller:0.20.0
• 使用宿主机网络:hostNetwork: true
5.8.3 Ingress(HTTP与HTTPS)
[5] 将公司项目部署到Kubernetes平台中
5.1. [准备工作与注意事项]
5.2. [准备基础镜像并推送到镜像仓库]
5.3. [在K8S中部署PHP项目]
5.4. [在K8S中部署Java项目]
[6] 使用Prometheus全方位监控Kubernetes
6.1. [K8S监控指标]
6.2. [Prometheus是什么]
6.3. [Prometheus组件及架构]
6.4. [Prometheus数据模型]
6.5. [Prometheus监控K8S架构]
6.6. [在K8S中部署Prometheus]
6.7. [监控K8S集群Node]
6.8. [在K8S中部署Grafana与可视化]
6.9. [监控K8S集群中Pod与资源对象]
6.10.[在K8S中部署Alertmanager]
6.11.[告警规则与告警通知]
[7] 使用ELK Stack收集Kubernetes平台中日志与可视化
7.1. [收集哪些日志]
7.2. [日志方案]
7.3. [容器中的日志怎么收集]
[8] 资源扩容
8.1. [Master扩容]
8.2. [Node扩容]
8.3. [Pod扩容/缩容]
[9] 项目发布方案
9.1. [蓝绿发布]
9.2. [灰度发布]
9.3. [滚动发布]
9.4. [Kubernetes中的滚动更新]
[10] 基于Kubernetes构建企业Jenkins CI/CD平台
10.1. [发布流程设计]
10.2. [部署Harbor镜像仓库]
10.3. [部署Git仓库]
10.4. [构建Jenkins-Slave镜像]
10.5. [在Kubernetes中部署Jenkins]
10.6. [Jenkins与Kubernetes集成]
10.7. [流水线发布Java项目]
10.8. [回滚]
更多推荐
所有评论(0)