备忘录:Kubernetes/EKS基础①(k8s组件)
备忘录
-
- k8sのリソース
-
- EKSの運用
- Fargateの制限 など
简单的尝试方法
只需使用Docker Desktop启用Kubernetes即可。

基本资源

容器
由实际运行的容器创建,该容器是根据容器镜像生成的。
第一個選項:豆荚
由容器组成的集合体。由一个或多个容器组成。也可能包含用于Pod之间使用的存储。
复制集合
用于管理副本(相同配置的Pod)数量的资源。由Deployment资源定义。
部署
定义需要多少容器。从这里开始创建ReplicaSet,Pod和Container。
服务
管理对Pod的访问。通过使用在Service中定义的方法来访问Pod,将对Pod的访问进行抽象化。
对基本资源进行简单验证
简述
使用nginx镜像创建一个配置,在http://localhost:30080上进行连接,连接到任一Pod的结构。
在Service中定义连接的位置,在Deployment中定义Pod的位置。

准备
准备以下的yaml文件。
- Deploymentリソースの定義ファイル
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx-app
replicas: 2
template:
metadata:
labels:
app: nginx-app
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
- Serviceリソースの定義ファイル
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
ports:
- port: 8080
targetPort: 80
protocol: TCP
nodePort: 30080
selector:
app: nginx-app
制作 (zuò
- Deploymentリソースの作成と確認
% kubectl apply -f nginx-deployment.yml
deployment.apps/nginx-deployment created
% kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-xxxxxxxxxx-xxxxx 1/1 Running 0 10s
nginx-deployment-xxxxxxxxxx-xxxxx 1/1 Running 0 10s
- Serviceリソースの作成と確認
% kubectl apply -f nginx-service.yml
service/nginx-service created
% kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP xx.xx.xx.xx <none> 443/TCP 18h
nginx-service NodePort xx.xx.xx.xx <none> 8080:30080/TCP 18s
-
- アクセス確認
- ブラウザからhttp://localhost:30080にアクセス

删除
- Deployment/Serviceリソースの削除
% kubectl delete -f nginx-deployment.yml
deployment.apps "nginx-deployment" deleted
% kubectl delete -f nginx-service.yml
service "nginx-service" deleted
% kubectl get pods
No resources found in default namespace.
% kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP xx.xx.xx.xx <none> 443/TCP 18h
Kubernetes的组件

kube-apiserver
kubectlの情報を受け取ってNodeやPodのスケジューリングを制御
kube-scheduler
新しいPodをどのNodeに配置するかをスケジューリング
kube-controller-manager
複数のコントローラーから構成。Nodeで実行されるワークロードの制御
cloud-controller-manager
AWSなどのクラウドプロバイダが提供するサービスと連携
etcd
マニフェストをキーバリューストアで管理
kubelet
Podがマニュフェスト通りの状態であるか確認
kubeproxy
クラスタ内外のネットワークトラフィックの制御
以应用上述的部署为例
-
- マニフェスト(yamlファイル)を作成する
kubectl applyで適用することによって、kube-apiserver経由でetcdに登録される
kube-controller-managerが必要なPodを起動するようにetcdに登録する
kube-schedulerがetcdから情報を取得して、Podを起動するノードを決定
kubeletが起動すべきPodを検知してPodを起動する
其他资源
命名空间
透过逻辑分割和管理集群的机制
apiVersion: v1
kind: Namespace
metadata:
name: k8s-test
您可以在下面确认。
kubectl config get-contexts
定时任务
每分钟,在k8s上定期执行程序的机制,会增加nginx容器。
apiVersion: batch/v1
kind: CronJob
metadata:
name: nginx-scheduled
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: nginx-scheduled
image: nginx
imagePullPolicy: Always
restartPolicy: OnFailure
当删除Cronjob时,容器也会被删除。
kubectl delete cronjob nginx-scheduled
守护进程集合
如果要启动用于日志收集的Pod,并且每个节点上都要启动一个预定义的Pod,除了使用Sidecar模式,还可以使用DeamonSet模式。

状态副本集
在k8s集群中处理持久化数据时使用提供稳定网络ID和持久存储 option :
在k8s集群内处理永久数据时,会提供稳定的网络ID和持久化存储。
秘密
将机密信息作为环境变量传递。在Pod启动时,前往Secret获取信息。由于只是base64编码,因此并不安全。可以使用kubeseal进行加密。
apiVersion: v1
kind: Secret
type: Opaque
metadata:
name: user-pass
stringData:
user-name: ${USER_NAME}
user-password: ${USER_PASSWORD}
参考方面的资源
env:
- name: USER_NAME
valueFrom:
secretKeyRef:
key: user-name
name: user-pass
- name: USER_PASSWORD
valueFrom:
secretKeyRef:
key: user-password
name: user-pass
配置地图
将非机密信息作为环境变量传递
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
app-name: web-server
app-url: http://example.co.jp
沿用方的资源
env:
- name: APP_NAME
valueFrom:
configMapKeyRef:
key: app-name
name: app-config
- name: APP_URL
valueFrom:
configMapKeyRef:
key: app-url
name: app-config
易播云服务
在使用时需要考虑的因素等。
安全相关
使用IAM进行验证

aws-auth:ユーザとGroup、IAMロールの関連付け
RoleBinding:GroupとRoleの関連付け
Role:許可する操作の定義
Pod安全验
定义Pod的隔离级别,并针对每个级别定义策略。限制Pod的行为。
隔离级别:特权、基准、受限
策略:强制执行、警告、审计
网络政策
可以控制Pod间的Ingress、Egress通信。类似于安全组的感觉。
监视
使用DeamonSet在每个节点上部署CloudWatch代理和Fluentd代理的配置。需要附加IAM角色到节点并创建用于Pod的Service Account。注意,在使用Fargate的情况下不能使用DeamonSet。

指标监控
使用CloudWatch Container Insight来监控每个Pod的指标。通过在节点上部署CloudWatch Agent来发送指标数据。
日志监控
Pod的日志将输出到节点内的目录中。Fluentd会监视该目录并将日志发送到CloudWatch Logs。
资源相关
Pod资源限制
在部署的定义中有限制。
requests:Podデプロイ時にホスト側に最低限求める要求量
limits:Podが使用出来るリソース上限
spec:
containers:
- name: app
image: images.my-company.example/app:v4
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
自动扩展
集群自动缩放器(Cluster Autoscaler)或Karpenter。此外,还有作为服务的自动缩放的水平 Pod 自动缩放器 (HPA)。
Cluster Autoscaler:Podがノード上にデプロイ出来ない時(requestsr量を確保出来ない時)にステータスがPendingとなる。この時にノード追加。
Horizontal Pod Autoscaler (HPA)
Podのリソース使用量に応じてPodのスケールアウト、スケールイン
Fargate使用时的限制
日志相关
由于Fargate中节点和Pod的启动比例是1:1,因此无法使用DeamonSet。目前常用的方法是使用嵌入式路由器并使用Fluent Bit。
过去我使用过侧边车模式。
CloudWatch 容器监控适用于 EKS Fargate。
使用Volume
EFS得到支持。EBS仅适用于EC2类型。
公网IP
无法分配公共IP。因此,无法使用NodePort配置从外部访问。
弹性负载均衡
只有ALB受支持,不支持CLB/NLB。在创建服务时选择负载均衡器会创建CLB,但这是不可用的。
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: LoadBalancer
selector:
app: nginx-service
ports:
- protocol: TCP
port: 8080
targetPort: 8080
网络政策
请勿使用。请使用安全组。
相关文章