1. 什么是有状态服务,什么是无状态服务
无状态服务:服务处理每个请求时不依赖任何客户端的上下文状态,每个请求都是独立的,无需参考之前的请求信息。
有状态服务: 服务在处理请求时需要依赖客户端的上下文信息(状态数据),这些状态数据会在多次请求之间保持和共享。
2. 什么是冗余
冗余: 系统中设置多个相同功能的组件,当某个组件失效时,其他组件能够继续提供服务,确保系统的可用性和可靠性。
3. 在k8s中无状态服务的冗余如何实现
通过 Deployment 实现冗余
vim django-blog.yaml #用一个博客网站举例
apiVersion: apps/v1
kind: Deployment
metadata:
name: django-blog
namespace: blog
spec:
replicas: 3
selector:
matchLabels:
app: django
template:
metadata:
labels:
app: django
spec:
containers:
- image: django-blog:v1
name: web
# 声明容器端口
ports:
- name: http
containerPort: 8080
resources:
# 资源请求
requests:
memory: "128Mi"
cpu: "250m"
# 资源限制
limits:
memory: "512Mi"
cpu: "500m"
---
apiVersion: v1
kind: Service
metadata:
name: django-blog
namespace: blog
spec:
ports:
- name: http
port: 80
protocol: Tcp
targetPort: 8080
selector:
app: django
type: NodePort4. kubectl create中的--dry-run=client有什么作用,用于什么场景
--dry-run=client: 在客户端模拟资源创建过程,不实际提交到API Server,用于验证和生成YAML。
1. 生成YAML模板:
kubectl create deployment nginx --image=nginx --dry-run=client -o yaml > nginx-deployment.yaml2. 验证资源定义:
kubectl create -f nginx-deployment.yaml --dry-run=client5. Deployment的主要功能是什么,解决了什么问题
Deployment的主要功能:
(1). 副本管理:确保指定数量的Pod副本在集群中运行。如果Pod副本数小于期望值,则会自动创建Pod;如果Pod副本数量小于期望值,则会自动创建Pod; 如果Pod副本数多于期望值,则删除多余的Pod。
(2). 滚动更新: 采用滚动更新策略,逐步进行新旧版本的Pod的替换,保障业务的连续性。
(3). 版本回滚: 如果应用程序在升级后出现问题或i不符合预期,可以执行回滚操作,以快速恢复到先前可用的版本。
解决的问题
解决了手动管理Pod的复杂性高、应用更新的风险、扩缩容困难的问题
6.Deployment其后端调用的那个服务
Deployment通过控制ReplicaSet来实现应用程序的部署和更新。ReplicaSet负责维护一组相同的Pod副本,以确保应用程序的可用性和可扩展性
Deployment → ReplicaSet → Pod7.什么是滚动更新,默认值是多少,如何设置
滚动更新: 逐步用新版本的Pod替换旧版本的Pod,确保服务在更新过程中持续可用。
默认值
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25% # 默认值:最多25%的Pod不可用
maxSurge: 25% # 默认值:最多超出25%的Pod8. 如果使用Deployment启动了多个Pod,那么其他服务是否需要更换访问IP或域名?有什么更好的方法
Deploymen会管理多个Pod副本,每个Pod都有自己的IP,但这些IP是不稳定的,因为Pod可能会被重新调度或重启。所以直接访问Pod的IP显然不可行。
这时候就需要使用通过 Kubernetes 的 Service 机制实现的。Service 会为多个 Pod 提供一个统一的访问入口(虚拟 IP 或 DNS 名称),并自动将流量负载均衡到后端的 Pod。
9. 什么是Service,其主要功能是什么
Service是Kubernetes中的一种资源对象,用于定义一组Pod的网络访问规则,它为Pod提供了一个稳定的统一访问,允许客户端始终使用同一个IP地址进行访问,避免了直接使用Pod IP地址导致的不稳定性。
Service主要有以下两种功能。
(1). 负载均衡:当多个Pod提供服务时,Service通过负载均衡算法将请求分发到那些Pod上,从而实现应用程序的负载均衡.
(2). 服务发现: Service提供了一种服务发现机制,自动维护后端Pod IP的变化,从而保证客户端访问应用程序不受后端Pod变化的影响。
10. Service的底层使用的什么服务
service底层实现主要由两个网络模式组成:iptables与IPVS。他们都是有kube-proxy维护
11. Service有几种网络类型,区别是什么
类型 | 集群内访问 | 外部访问 | 云依赖 | 端口范围 |
ClusterIP | 无 | 任意 | ||
NodePort | 无 | 30000-32767 | ||
LoadBalancer | 是 | 任意 | ||
ExternalName | 无 | N/A |
12. endpoint是什么与service有什么关系
当创建一个Service时,kubernetes会根据service创建一个Endpoints对象,该对象负责维护与Service相关的后端Pod信息,并确保Service可以被正确地转发到后端Pod。
关系图
13. BusyBox在K8s中有什么作用
在日常的运维与开发工作中,我们时常需要一些轻量级工具来快速执行诊断命令、测试网络连接或验证服务状态。
而BusyBox作为轻量级Linux工具箱,包含常用的Unix工具,镜像体积小(约1-5MB),是Kubernetes中常用的调试和测试工具。
14.创建一个Deployment,启动多副本Nginx,并为其设置ClusterlP类型的Service,使用busybox访问此Service验证是否能够访问到所有Nginx副本
cat nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:latest
name: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: ClusterIP
selector:
app: nginx
ports:
- port: 80
targetPort: 80
进入 busybox
kubectl run busybox --image=busybox --restart=Never --rm -it -- sh
/ # wget -q -O- http://nginx-service
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
## 访问成功15.设置kubectl别名为k,并配置命令自动补全
#配置命令
echo 'alias k=kubectl' >> ~/.bashrc
source ~/.bashrc
配置命令补全
sudo apt install bash-completion
# 先加载 bash-completion
echo 'source /usr/share/bash-completion/bash_completion' >> ~/.bashrc
# 再添加 kubectl 补全
echo 'source <(kubectl completion bash)' >> ~/.bashrc
echo 'complete -F __start_kubectl k' >> ~/.bashrc
# 重新加载
source ~/.bashrc
#这样就可以
kubectl get po<TAB>#自动补齐d