34 篇文章带有标签 “Kubernetes”

MinIO for Kubernetes

查看安装的对象

kubectl -n directpv get all
NAME                              READY   STATUS    RESTARTS      AGE
pod/controller-78d74455f8-64kqk   3/3     Running   0             24h
pod/controller-78d74455f8-jkvd7   3/3     Running   0             24h
pod/controller-78d74455f8-r5wd9   3/3     Running   0             24h
pod/node-server-5zkjg             4/4     Running   2 (24h ago)   24h
pod/node-server-nfcn2             4/4     Running   2 (24h ago)   24h

NAME                         DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/node-server   2         2         2       2            2           <none>          24h

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/controller   3/3     3            3           24h
// ...

查看 StorageClass 对象 directpv-min-io

Velero: 备份和迁移 Kubernetes 资源和持久卷

  • 数据迁移 通过轻松地将 Kubernetes 资源从一个集群迁移到另一个集群,实现集群可移植性。
  • 数据保护 提供关键数据保护功能,例如计划备份、保留计划以及用于自定义操作的备份前或备份后挂钩。

与其他直接访问 Kubernetes etcd 数据库来执行备份和恢复的工具不同,Velero 使用 Kubernetes API 来捕获集群资源的状态并在必要时恢复它们。这种 API 驱动的方法具有许多关键优势:

  • 备份可以捕获集群资源的子集,按命名空间、资源类型和/或标签选择器进行过滤,从而为备份和恢复的内容提供高度的灵活性。
  • 托管 Kubernetes 产品的用户通常无权访问底层 etcd 数据库,因此无法直接备份/恢复它。
  • 通过聚合 API 服务器公开的资源可以轻松备份和恢复,即使它们存储在单独的 etcd 数据库中也是如此。

此外,Velero 使您能够使用存储平台的本机快照功能或称为 Restic 的集成文件级备份工具来备份和恢复应用程序的持久数据及其 配置。

在 Kubernetes 上部署 MySQL

If you don't see a command prompt, try pressing enter.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.51 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Elastic Cloud on Kubernetes 快速入门

kubectl create -f https://download.elastic.co/downloads/eck/2.8.0/crds.yaml
customresourcedefinition.apiextensions.k8s.io/agents.agent.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/apmservers.apm.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/beats.beat.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/elasticmapsservers.maps.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/elasticsearchautoscalers.autoscaling.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/elasticsearches.elasticsearch.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/enterprisesearches.enterprisesearch.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/kibanas.kibana.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/logstashes.logstash.k8s.elastic.co created
customresourcedefinition.apiextensions.k8s.io/stackconfigpolicies.stackconfigpolicy.k8s.elastic.co created

使用 StorageClass 动态创建 NFS 持久卷

使用卷时, 在 .spec.volumes 字段中设置为 Pod 提供的卷,并在 .spec.containers[*].volumeMounts 字段中声明卷在容器中的挂载位置。

emptyDir 卷的存储介质(例如磁盘、SSD 等)是由保存 kubelet 数据的根目录(通常是 /var/lib/kubelet)的文件系统的介质确定。 Kubernetes 对 emptyDir 卷或者 hostPath 卷可以消耗的空间没有限制,容器之间或 Pod 之间也没有隔离。

PV 对象是由运维人员事先创建在 Kubernetes 集群里待用的。

PVC 对象通常由开发人员创建。

每个 StorageClass 都包含 provisioner、parameters 和 reclaimPolicy 字段, 这些字段会在 StorageClass 需要动态制备 PersistentVolume 时会使用到。

  • no_subtree_check NFS 服务器将忽略子目录的检查。这意味着,无论请求的路径是否位于共享目录的子目录中,NFS服务器都将按照共享目录的权限设置来处理请求。这样可以提高性能,因为服务器不再需要进行额外的子目录检查。

需要谨慎使用,以确保共享目录的访问权限受到正确的限制。

no_root_squash no_root_squash 选项用于取消 NFS 服务器对 root 用户的权限限制,

安装Kubernetes 1.26.0

kubectl apply -f components.yaml

角色绑定

kubectl create clusterrolebinding kubernetes-dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:kubernetes-dashboard

本机运行

scp root@172.16.33.157:/etc/kubernetes/admin.conf ~/.kube/config
kubectl proxy
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/node?namespace=default

服务器端获取 Token

kubectl -n kubernetes-dashboard create token kubernetes-dashboard

解决方法:

sudo mv /etc/containerd/config.toml /tmp/
sudo systemctl restart containerd

解决方法: sudo systemctl daemon-reload su

安装Kubernetes Dashboard

过几分钟后您将看到 kubernetes-dashboard 名字空间下会有 Pod 运行。

kubectl get pods -n kubernetes-dashboard

NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-6b4884c9d5-27xf6   1/1     Running   0          4m
kubernetes-dashboard-7b544877d5-mfmbp        1/1     Running   0          4m
cat <<EOF | kubectl apply -f -
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
// ...

输入 Token 信息登录。完成后,我们可以看到 Kubernetes 集群信息。

在您的本地浏览器输入地址 http://loca

Kubernetes中的计算资源管理

容器内运行 top

kubectl exec -it requests-pod top
Mem: 369767748K used, 26208028K free, 51000K shrd, 3765588K buff, 294978160K cached
CPU:  3.1% usr  1.5% sys  0.0% nic 95.2% idle  0.0% io  0.0% irq  0.0% sirq
Load average: 1.44 1.65 1.66 4/6602 18
  PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND
    1     0 root     R     1308  0.0  27  2.5 dd if /dev/zero of /dev/null
   13     0 root     R     1324  0.0  38  0.0 top

★ 在容器内看到的 CPU 和内存是节点的。

top 命令显示占用了 2.5% CPU,对于 40 核的系统来说显然是占用了一个核。requests 不会限制资源的使用数量,因为是单线程,最多也就能用满一个核。

容器内运行 top kubectl exec -it limits-pod top Mem: 370581688K used, 25394088K free, 50976K shrd, 3774664K buff, 292993444K cached

minikube

# minikube delete
🔄  正在使用 kubeadm 卸载 Kubernetes v1.17.3…
🔥  正在删除 none 中的“minikube”…
💀  Removed all traces of the "minikube" cluster.
rm -rf ~/.minikube/
rm -rf ~/.kube/
rm -f /usr/local/bin/minikube

解决办法:

minikube start --force --driver=docker

在Kubernetes上安装Ingress

  1. 解压
tar xzvf ingress-nginx-3.3.0.tgz
cd ingress-nginx
  1. 替换镜像
vim values.yaml
    repository: k8s.gcr.io/ingress-nginx/controller
    digest: sha256:fc4979d8b8443a831c9789b5155cded454cb7de737a8b727bc2ba0106d2eae8b

替换为下面的内容

    repository: pollyduan/ingress-nginx-controller
    # digest: sha256:fc4979d8b8443a831c9789b5155cded454cb7de737a8b727bc2ba0106d2eae8b
  1. Helm 使用本地目录的 Chart 进行安装
cd ..
helm install ingress-nginx ./ingress-nginx

Kubernetes API 服务器的安全防护

创建 docker-registry Secret

kubectl create secret docker-registry mydockerhubsecret \
  --docker-username=myusername \
  --docker-password=mypassword \
  --docker-email=myemail

编写 ServiceAccount YAML 文件(sa-image-pull-secret.yaml)

apiVersion: v1
kind: ServiceAccount
metadata:
  name: image-pull-secret
imagePullSecrets:
- name: mydockerhubsecret

创建 ServiceAccount 对象

kubectl apply -f sa-image-pull-secret.yaml

编写 Pod YAML 文件(private-serviceaccount.yaml),指定 serviceAccountName 为 image-pull-secret。

Kubernetes中的污点和容忍度

例子

dedicated=foo:PreferNoSchedule
node-role.kubernetes.io/master:NoSchedule
node.kubernetes.io/unreachable:NoExecute
node.kubernetes.io/unreachable:NoSchedule

一个 key 可以有多个 effect

查看集群所有节点的污点信息 $ kubectl get nodes -o=jsonpath='{range .items[]}{.metadata.name}{"\t"}{.status.addresses[0].address}{"\n"}{range .spec.taints[]}{"\t"}{.key}{"="}{.value}{":"}{.effect}{"\n"}{end}{end}' gpu1 172.16.33.66 node.kubernetes.io/unreachable=:NoSchedule node.kubernetes.io/unreachable=:NoExecute ln1 172.16.33.157 node-role.kubernetes.

Kubernetes中的Job和CronJob

tan(π/4) = 1。所以,4*atan(1)正好就是π,也就是 3.1415926…。

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      restartPolicy: Never
      containers:
      - name: pi
        image: alpine
        command: ["sh", "-c", "echo 'scale=6000; 4*a(1)' | bc -l"]
  • restartPolicy: Pod 内所有容器的重启策略。对于 Job 重启策略只能是 OnFailure 和 Never,默认是 Always。
    • OnFailure
    • Never
    • Always(default)

运行完成后再次查看,Pod 的状态变为 Completed,不会自动删除,方便您查看日志。

$ kubectl get all
NAME           READY   STATUS      RESTARTS   AGE
pod/pi-866nk   0/1     Completed   0          11m

NAME           COMPLETIONS   DURATION   AGE
job.batch/pi   1/1           10m        11m

查看 Job 对象的描述 $ kubectl describe job pi

Kubernetes中的DaemonSet

查看 Pod 对象

$ kubectl get pods -o wide
NAME          READY   STATUS              RESTARTS   AGE   IP           NODE   NOMINATED NODE   READINESS GATES
kubia-h48q8   1/1     Running             0          23s   10.38.0.19   ln2    <none>           <none>
kubia-tx5hz   1/1     Running             0          23s   10.34.0.10   ln6    <none>           <none>
kubia-x9479   0/1     ContainerCreating   0          23s   <none>       ln3    <none>           <none>

修改 DaemonSet 的YAML文件(kubia-ds.yaml) apiVersion: apps/v1 kind: DaemonSet metadata: name: kubia spec: selector: matchLabels: app: kubia template: metadata: labels: app: kubia spec: tolerations: - key: node-role.kubernetes.