备忘录:Kubernetes/EKS基础①(k8s组件)

备忘录

    • k8sのリソース

 

    • EKSの運用

 

    Fargateの制限 など

简单的尝试方法

只需使用Docker Desktop启用Kubernetes即可。

スクリーンショット 2022-12-07 8.33.12.png

基本资源

スクリーンショット 2022-12-07 8.33.31.png

容器

由实际运行的容器创建,该容器是根据容器镜像生成的。

第一個選項:豆荚

由容器组成的集合体。由一个或多个容器组成。也可能包含用于Pod之间使用的存储。

复制集合

用于管理副本(相同配置的Pod)数量的资源。由Deployment资源定义。

部署

定义需要多少容器。从这里开始创建ReplicaSet,Pod和Container。

服务

管理对Pod的访问。通过使用在Service中定义的方法来访问Pod,将对Pod的访问进行抽象化。

对基本资源进行简单验证

简述

使用nginx镜像创建一个配置,在http://localhost:30080上进行连接,连接到任一Pod的结构。
在Service中定义连接的位置,在Deployment中定义Pod的位置。

スクリーンショット 2022-12-07 9.34.31.png

准备

准备以下的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にアクセス
スクリーンショット 2022-12-07 9.41.15.png

删除

    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的组件

 

スクリーンショット 2022-12-15 11.38.45.png

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模式。

スクリーンショット 2022-12-13 13.20.36.png

状态副本集

在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进行验证

 

スクリーンショット 2022-12-15 9.32.05.png

aws-auth:ユーザとGroup、IAMロールの関連付け

RoleBinding:GroupとRoleの関連付け

Role:許可する操作の定義

Pod安全验

定义Pod的隔离级别,并针对每个级别定义策略。限制Pod的行为。
隔离级别:特权、基准、受限
策略:强制执行、警告、审计

 

网络政策

可以控制Pod间的Ingress、Egress通信。类似于安全组的感觉。

 

监视

使用DeamonSet在每个节点上部署CloudWatch代理和Fluentd代理的配置。需要附加IAM角色到节点并创建用于Pod的Service Account。注意,在使用Fargate的情况下不能使用DeamonSet。

スクリーンショット 2022-12-15 8.37.30.png

指标监控

使用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

网络政策

请勿使用。请使用安全组。

相关文章

 

bannerAds