参考资料
- Kubernetes 文档
- kubernetes基础教程
- Kubernetes学习指南:https://www.k8stech.net/k8s-book/
- kubernetes权威指南
-
[kubernetes-handbook Kubernetes 中文指南/云原生应用架构实战手册](https://jimmysong.io/kubernetes-handbook/) - https://github.com/rootsongjc/kubernetes-handbook
- pdf下载:https://github.com/rootsongjc/kubernetes-handbook/releases
- 迁移到云原生应用架构
- istio-handbook
- Ingress的概念和原理
- Ingress详细介绍
- K8s ❉ 基本数据存储详解-EmptyDir/HostPath/NFS:https://blog.csdn.net/wangjie72270/article/details/122298692
- 慕课教程-第29周 容器编排-K8S
一、K8S介绍
Kubernetes 是 Google 基于 Borg 开源的容器编排调度引擎,作为 CNCF(Cloud Native Computing Foundation)最重要的组件之一,它的目标不仅仅是一个编排系统,而是提供一个规范,可以让你来描述集群的架构,定义服务的最终状态,Kubernetes 可以帮你将系统自动得达到和维持在这个状态。
更具体的说,Kubernetes 用户可以通过编写一个 YAML 或者 json 格式的配置文件,也可以通过工具 / 代码生成或直接请求 Kubernetes API 创建应用,该配置文件中包含了用户想要应用程序保持的状态,不论整个 Kubernetes 集群中的个别主机发生什么问题,都不会影响应用程序的状态,你还可以通过改变该配置文件或请求 Kubernetes API 来改变应用程序的状态。
1.1 K8S整体架构,功能介绍
- Kubernetes Master : 主节点
- API Server:请求统一入口
- Scheduler:节点调度、任务发布
- Controller Manager:资源统筹管理,资源任务统一调度部署
- replication controller:复制控制器
- namespace controller:
- Etcd:配置集群管理(数据库)
- Network-Flannel calico canal:通信
- Node`s Companents
- Node
- kubelet: 节点管理,容器的启停管理、分配网络资源…
- kubelet-proxy(service?):服务发现、通信
- docker:容器,需要真正运行的
- Pod:运行在一个node上,Kubernetes的最小工作单元,pod中的容器共享网络和存储
- 一个 Pod 可以有多个容器,在现实场景中,一般一个pod对应一个容器
- 一个pod对应一个ip(相当于一个逻辑主机),并且这个ip是短暂的,重启后ip会出现变化
- controller:控制器
- deployment:部署无状态应用,例如 微服务应用
- stateSet:部署有状态应用,例如 mysql主从
- replicaSet
- daemonSet:
- job 一次性任务
- cronjob 定时任务
- service:是一个抽象概念,它定义了一组服务的多个pod逻辑合集和访问pod的策略
- 1、能够管理一组pod,为一组具有相同功能的pod提供一个统一的入口地址
- 2、对组内的pod进行服务发现和负载均衡
- 3、service将请求进行负载分发到后端的各个POD实例上,客户端只需要访问 Service 的 IP,Kubernetes 则负责建立和维护 Service 与 Pod 的映射关系
二、K8S基础集群搭建-3节点
- 使用 kubeadm 创建 K8S 集群
- 使用 kind 创建 K8S 集群
- 使用 Kubespray 创建 K8S 集群
软件安装-docker、kubelet、kubeadm、kubectl
master上创建集群-kubeadm init & kubeadm apply
node加入集群-kubeadm join
三、K8S原理剖析与实战
5 【原理剖析】K8S调度原理剖析与Pod生命周期管理
6 【原理剖析】K8S控制器管理原理剖析与实战
7 【原理剖析】Yaml配置实战总结
8 【原理剖析】K8S网络模型原理剖析与实战
9 【原理剖析】K8S服务发现与负载均衡原理剖析与实战
10 【架构思考】K8S系统分层架构回顾和故障排除思路
11 【原理剖析】K8S存储原理剖析与实战
12 【原理实战】K8S存储原理实战-1
13 【原理实战】K8S存储原理实战-2
14 【原理剖析】K8S认证授权原理剖析与实战
15 【架构思考】如何实现集群访问的安全性、可用性、完整性
16 【核心基本功】K8S管理界面日常操作
17 【知识扩展】K8S集群监控,实现快速故障排查和业务连续性保障
18 【性能监控Demo】prometheus时间序列监控,知其然
19 【日志监控Demo】ELK日志管理,知其所以然
20 【架构思考】如何实现大规模集群?10节点-100节点-1000节点
21 【架构升级】全链路高可用架构升级
22 【知识扩展】如何基于容器编排工具实现CICD
23 【K8S技术落地实战】部署微服务-1
24 【K8S技术落地实战】部署微服务-2
25 【K8S技术落地实战】部署微服务-3
26 【K8S技术落地实战】部署微服务-4
27 【K8S技术落地实战】部署微服务-5
四、kubectl常用命令
## 查看集群信息
kubectl cluster-info
## 查看node信息
kubectl get nodes -o wide
## 查看pod信息
kubectl get pods -A -o wide -n namespace
## 创建 查看namespace
kubectl create namespace abc
kubectl get ns
## 发布删除应用
kubectl apply -f appserver.yaml
kubectl delete -f appserver.yaml
## 查看服务service
kubectl get svc -n namespace1
## 查看ingress
kubectl get ingress -A
kubectl describe ing, svc -n namespace
## 查看日志
# 输出一个单容器pod POD的日志到标准输出
$ kubectl logs podName
# 持续输出一个单容器pod POD的日志到标准输出
kubectl logs --tail=200 -n default demo-server -f
kubectl logs -f --tail=200 pods/appServer-0 -n default
kubectl logs -f --tail=200 pods/appServer-0 -n default|grep 'time out'
## 查看服务重启前一版本的日志输出
kubectl logs -f --tail 100 XXXpod -n namespace --previous
## 进入pod
kubectl exec -it -n ingress-nginx /bin/bash
## 查看pod启动失败报错
kubectl describe pod demo-server-645bf9cfbd-ngkr4 -n default
## copy容器内日志文件
kubectl cp default/appServer-0:/opt/1.log /home/1.log
## 动态日志导出
kubectl logs appServer-0 -n default | grep '2022-10-31 17:*' > /tmp/appServer-0.txt
## 导出yaml
kubectl get pods appServer-deployment-0 -n default -o yaml
kubectl get deployment appServer-deployment -n default -o yaml > ./appServer-deployment.yaml
kubectl get service appServer-service -n default -o yaml > ./appServer-service.yaml
## 创建证书
kubectl get secrets -n demo
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/C=CN/ST=BJ/L=BJ/O=nginx/CN=wds.demo.com"
kubectl create secret tls tls-secret --key tls.key --cert tls.crt -n demo
##查看node内存使用
kubectl top node -n namespace1 --sort-by memory
## 查看pod内存使用
kubectl top po -n namespace1 --sort-by memory
# 容器创建阻塞,不知道yaml在哪里
kubectl get deployment -n grafana # 查看副本状态
kubectl scale deployment grafana --replicas=0 -n grafana #副本缩为0
kubectl scale deployment grafana --replicas=1 -n grafana #副本扩为1
# 扩缩容器副本数
$ kubectl scale deployment DEPLOYMENT --replicas=8
$ kubectl scale statefulset loki --replicas=1 -n loki
# 显示pod节点的标签信息
$ kubectl get pod --show-labels
# 根据指定标签匹配到具体的pod
$ kubectl get pod -l app=example(标签键值对)
# 查看最近几秒,几分,或者几小时,几天的日志信息,--since 选参
$ kubectl logs -f -n namespace pod-name --since=1h
# 指定时间戳输出日志
$ kubectl logs podName --since-time=2018-11-01T15:00:00Z
指定某个时间点之后的日志信息查看,--since-time 选参
表示查看12月22号10点之后的日志信息 +00:00 表示这个时间点向前推多长时间的日志
$ kubectl logs -f -n namespace pod-name --since-time="2021-12-22T02:00:00+00:00"
# 查看运行pod的环境变量
$ kubectl exec podName env
## k3s节点证书过期
### k3s证书过期时间检查:
### k3s server:
for i in `ls /var/lib/rancher/k3s/server/tls/*.crt`; do echo $i; openssl x509 -enddate -noout -in $i; done
### 重启k3s更新证书:
systemctl restart k3s
### k3s agent:
for i in `ls /var/lib/rancher/k3s/agent/*.crt`; do echo $i; openssl x509 -enddate -noout -in $i; done
### 重启k3s agent更新证书:
systemctl restart k3s-agent
五、yml配置总结
apiVersion: batch/v1
kind: Job
metadata:
name: demo-job
namespace: demo-ns
spec:
template:
metadata:
name: demo-job
spec:
nodeName: 192.168.1.1 //指定pod运行node
hostAliases: //配置pod的hosts域名解析
- hostnames:
- "h1.tdengine.com"
ip: 192.168.1.1
- hostnames:
- "h2.tdengine.com"
ip: 192.168.1.2
- hostnames:
- "h3.tdengine.com"
ip: 192.168.1.3
containers:
- name: demo-job
image: demo-job:1.15.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3100
name: http
protocol: TCP
- env:
resources: //资源限制
limits:
cpu: "1"
memory: 2Gi
requests:
cpu: 200m
memory: 256Mi
六、TLS证书创建、配置、更新
## 1.证书创建或购买
上传创建或购买的证书xx.key xx.pem
## 2.创建命名空间下的secret
kubectl create secret tls sre-secret --namespace grafana --key xx.key --cert xx.pem
查看
kubectl get secrets -n grafana
kubectl get secrets -n grafana sre-secret -o yaml
## 3.编辑业务grafana-ingress.yml,配置域名证书
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: grafana
namespace: grafana
labels:
app.kubernetes.io/name: grafana
app.kubernetes.io/instance: grafana
spec:
ingressClassName: nginx
tls:
- hosts:
- grafana.xx.cn
secretName: sre-secret
rules:
- host: grafana.xx.cn
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: grafana
port:
number: 80
## 4.证书过期更新
上传新的证书xx.key xx.pem
kubectl delete secrets -n grafana sre-secret
kubectl create secret tls sre-secret --namespace grafana --key xx.key --cert xx.pem
七、k8s集群接入私有镜像仓库
1. 修改hosts指定映射关系(需在k8s 所有工作节点修改)
sudo vim /etc/hosts
192.168.1.1 hub.wds.com
2. containerd 设置为跳过tls认证(需在k8s 所有工作节点修改)
若私有仓库无证书或证书不可靠 需要执行此步骤
sudo vi /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."hub.wds.com".tls]
insecure_skip_verify = true
#重启containerd
systemctl daemon-reload
sudo systemctl restart containerd
3. 在业务命名空间创建docker 账号登录的secert
kubectl -n namespace-demo create secret docker-registry demo-regcred \
--docker-server="http://hub.wds.com" \
--docker-username="username" \
--docker-password='password'
Post Directory
扫码关注公众号:暂无公众号
发送 290992
即可立即永久解锁本站全部文章