如何执行到 K8s节点?
到目前为止,我只找到了执行到节点上运行的容器的方法。
我想避免ssh
。
如何执行到 K8s节点?
到目前为止,我只找到了执行到节点上运行的容器的方法。
我想避免ssh
。
我试图使用 kubeadm 创建一个 Kubernetes 集群。我启动了一个 Ubuntu 18.04 服务器,安装了 docker(确保 docker.service 正在运行),安装了 kubeadm kubelet 和 kubectl。
以下是我执行的步骤:
sudo apt-get update
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu `lsb_release -cs` test"
sudo apt update
sudo apt install docker-ce
sudo systemctl enable docker
sudo systemctl start docker
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
sudo apt-get install kubeadm kubelet kubectl -y
sudo apt-mark hold kubeadm kubelet kubectl
kubeadm version
swapoff –a
此外,为了配置 Docker cgroup 驱动程序,我编辑了/etc/systemd/system/kubelet.service.d/10-kubeadm.conf。在文件中,我添加Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"
并注释掉了Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
.
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf供参考:
# Note: This dropin only works with kubeadm and kubelet v1.11+
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
#Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
在此之后我跑了:systemctl daemon-reload
和systemctl restart kubelet
。kubelet.service 运行良好。
接下来,我运行sudo kubeadm init --pod-network-cidr=10.244.0.0/16
并收到以下错误:
root@ip-172-31-1-238:/home/ubuntu# kubeadm init --pod-network-cidr=10.244.0.0/16
[init] 使用 Kubernetes 版本:v1.23.1
[preflight] 运行飞行前检查
[preflight] 拉取设置 Kubernetes 集群所需的映像
[preflight] 这可能需要一两分钟,具体取决于您的 Internet 连接速度
[preflight] 您也可以使用“kubeadm config images pull”预先执行此操作
[ certs] 使用 certificateDir 文件夹 "/etc/kubernetes/pki"
[certs] 生成 "ca" 证书和密钥
[certs] 生成 "apiserver" 证书和密钥
[certs] 为 DNS 名称 [ip-172-31-1-238 kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] 和 IP [10.96.0.1 172.31.1.238] 签名的 apiserver 服务证书
[certs] 生成“apiserver-kubelet-client”证书和密钥
[certs] 生成“front-proxy-ca”证书和密钥
[certs] 生成“front-proxy-client”证书和密钥
[certs] 生成“etcd/ca” " 证书和密钥
[certs] 生成 "etcd/server" 证书和密钥
[certs] etcd/server 为 DNS 名称 [ip-172-31-1-238 localhost] 和 IP [172.31.1.238 127.0.0.1 签名::1]
[certs] 生成“etcd/peer”证书和密钥
[certs] etcd/peer 服务证书为 DNS 名称 [ip-172-31-1-238 localhost] 和 IP [172.31.1.238 127.0.0.1 ::1]
[certs] 生成“etcd/healthcheck-client”证书和密钥
[certs] 生成 "apiserver-etcd-client" 证书和密钥
[certs] 生成 "sa" 密钥和公钥
[kubeconfig] 使用 kubeconfig 文件夹 "/etc/kubernetes"
[kubeconfig] 编写 "admin.conf" kubeconfig 文件
[kubeconfig] 写入“kubelet.conf”kubeconfig 文件
[kubeconfig] 写入“controller-manager.conf”kubeconfig 文件
[kubeconfig] 写入“scheduler.conf”kubeconfig 文件
[kubelet-start] 将带有标志的 kubelet 环境文件写入文件“/ var/lib/kubelet/kubeadm 标志。环境"
[kubelet-start] 将 kubelet 配置写入文件 "/var/lib/kubelet/config.yaml"
[kubelet-start] 启动 kubelet
[control-plane] 使用清单文件夹 "/etc/kubernetes/manifests"
[control-plane ] 为“kube-apiserver”
创建静态 Pod 清单 [control-plane] 为“kube-controller-manager”
创建静态 Pod 清单 [control-plane] 为“kube-scheduler”
创建静态 Pod 清单 [etcd] 创建静态 Pod 清单对于“/etc/kubernetes/manifests”中的本地 etcd
[wait-control-plane] 等待 kubelet 作为静态 Pod 从目录“/etc/kubernetes/manifests”启动控制平面。这最多可能需要 4m0s
[kubelet-check] 40s 的初始超时已通过。Unfortunately, an error has occurred: timed out waiting for the condition This error is likely caused by: - The kubelet is not running - The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled) If you are on a systemd-powered system, you can try to troubleshoot the error with the following commands: - 'systemctl status kubelet' - 'journalctl -xeu kubelet' Additionally, a control plane component may have crashed or exited when started by the container runtime. To troubleshoot, list all containers using your preferred container runtimes CLI. Here is one example how you may list all Kubernetes containers running in docker: - 'docker ps -a | grep kube | grep -v pause' Once you have found the failing container, you can inspect its logs with: - 'docker logs CONTAINERID'
运行后systemctl status kubelet.service
,似乎 kubelet 运行良好。
但是,运行后journalctl -xeu kubelet
,我得到以下日志:
kubelet.go:2347]“容器运行时网络未准备好”networkReady="NetworkReady=false 原因:NetworkPluginNotReady 消息:docker:网络插件未准备好:cni 配置未初始化"
kubelet.go:2422]"获取节点时出错"err="节点“ip-172-31-1-238”未找到”
kubelet.go:2422]“获取节点时出错”err="节点“ip-172-31-1-238”未找到”
controller.go:144]无法确保租约存在,将在 7 秒后重试,错误:Get "https://172.31.1.238:6443/apis/coordination.k8s.io/v1/namespaces/kube-node-lease/leases/ip-172-31 -1-238?timeout=10s": dial tcp 172.31.1.238:6443: connect: connection
denied kubelet.go:2422] "Error getting node" err="node "ip-172-31-1-238" not found "
kubelet.go:2422]“获取节点时出错”err="未找到节点“ip-172-31-1-238”"
kubelet_node_status.go:70] "正在尝试注册节点" node="ip-172-31-1-238"
kubelet_node_status.go:92] "无法向 API 服务器注册节点" err="Post "https://172.31 .1.238:6443/api/v1/nodes": 拨打 tcp 172.31.1.238:6443: 连接: 连接被拒绝" node="ip-172-31-1-238"
kubelet.go:2422] "获取节点时出错" 错误="节点 "ip-172-31-1-238" 未找到"
版本:
Docker: Docker 版本 20.10.12,构建 e91ed57
Kubeadm: {Major:“1”,Minor:“23”,GitVersion:“v1.23.1”,GitCommit:“86ec240af8cbd1b60bcc4c03c20da9b98005b92e”,GitTreeState:“clean”,BuildDate:” 2021-12-16T11:39:51Z",GoVersion:"go1.17.5",编译器:"gc",平台:"linux/amd64"}
不确定这是否是 Kube Api Server 和 Kubelet 之间的连接问题。
有谁知道如何解决这一问题?
我尝试使用 kustomize 将属性文件加载为配置映射。
为此,我在 github链接中创建了一个示例集。
使用基本文件:
#kustomize build base
apiVersion: v1
data:
config: |-
dbport=1234
dcname=sfsdf
dbssl=false
locktime=300
domainuser=
kind: ConfigMap
metadata:
labels:
owner: sara
name: database-configmap
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
owner: sara
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
owner: sara
template:
metadata:
labels:
app: nginx
owner: sara
spec:
containers:
- image: nginx
name: nginx
使用外部文件:
#kustomize build file
apiVersion: v1
data:
config: "dbport=156767\r\ndcname=dfsd\r\ndbssl=false\r\nlocktime=300\r\ndomainuser=somedts"
kind: ConfigMap
metadata:
labels:
env: dev
owner: sara
name: dev-database-configmap
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
env: dev
owner: sara
name: dev-nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
env: dev
owner: sara
template:
metadata:
labels:
app: nginx
env: dev
owner: sara
spec:
containers:
- image: nginx
name: nginx
如果您观察到 configmap|
被删除并替换\r\n
为单个字符串。如何修复这种对齐方式?
我想用letsencrypt创建一个证书。
当我运行这个 yml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: grafana-tls
namespace: grafana
type: "kubernetes.io/tls"
spec:
secretName: grafana-tls
issuerRef:
name: letsencrypt-prod
dnsNames:
- mydomain.com
和kubectl apply -f .\grafana-tls.yml --validate=false
我遇到了以下错误
未找到引用的“颁发者”:未找到 issuer.cert-manager.io “letsencrypt-prod”
但是当我执行时kubectl get clusterissuer
,我遇到了这个结果
姓名准备年龄
letencrypt-prod True 3d22h
为了部署集群发行者,我使用了这个配置
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
namespace: ingress-basic
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: myEmail
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
我使用 nginx ingress 作为负载均衡器部署了 bitnami/wordpress helm,就像这里一样。一切正常,但问题出在一些 pod 是手动创建或通过自动缩放自动创建时。其中一些(不是全部)一直处于“ContainerCreating”状态,日志如下所示:
Normal Scheduled 33m default-scheduler Successfully assigned default/wordpress-69c8f65d96-wnkfv to main-node-d29388
Warning FailedMount 4m28s (x6 over 29m) kubelet Unable to attach or mount volumes: unmounted volumes=[wordpress-data], unattached volumes=[default-token-s4gdj wordpress-data]: timed out waiting for the condition
Warning FailedMount 0s (x9 over 31m) kubelet Unable to attach or mount volumes: unmounted volumes=[wordpress-data], unattached volumes=[wordpress-data default-token-s4gdj]: timed out waiting for the condition
我部署了 bitnami/wordpress,然后使用以下设置进行了升级:
helm install wordpress bitnami/wordpress --set service.type=ClusterIP --set ingress.enabled=true --set ingress.certManager=true --set ingress.annotations."kubernetes\.io/ingress\.class"=nginx --set ingress.annotations."cert-manager\.io/cluster-issuer"=letsencrypt-prod --set ingress.hostname=DOMAIN.com --set ingress.extraTls[0].hosts[0]=DOMAIN.com --set ingress.extraTls[0].secretName=wordpress.local-tls --set wordpressPassword=PASSWORD --set autoscaling.enabled=true --set autoscaling.minReplicas=1 autoscaling.maxReplicas=30
kubectl get pods 看起来像这样
ingress-nginx-ingress-controller-84bff86888-f4tpb 1/1 Running 0 2d3h
ingress-nginx-ingress-controller-default-backend-c5b786dbbqw5xz 1/1 Running 0 2d3h
load-generator 1/1 Running 0 71s
wordpress-69c8f65d96-48jd9 0/1 ContainerCreating 0 18m
wordpress-69c8f65d96-66ftt 0/1 ContainerCreating 0 56m
wordpress-69c8f65d96-dq7xq 1/1 Running 0 100m
wordpress-69c8f65d96-fbnt6 1/1 Running 0 101m
wordpress-69c8f65d96-wnkfv 0/1 ContainerCreating 0 56m
wordpress-mariadb-0 1/1 Running 0 8h
怎样做才能使新 pod 没有这个问题并让它们启动?
我有一个带有系统 pod(即kube-system
命名空间)和我的应用程序 pod 的 K3s 集群:
kube-system pod/calico-node-xxxx
kube-system pod/calico-kube-controllers-xxxxxx
kube-system pod/metrics-server-xxxxx
kube-system pod/local-path-provisioner-xxxxx
kube-system pod/coredns-xxxxx
app-system pod/my-app-xxxx
db-system pod/my-db-xxxxx
我正在寻找一个 shell/kubectl 命令(用于自动化脚本),它可以删除我的应用程序命名空间(想要修改kubectl delete namespace app-system db-system
)而不在命令中提及应用程序命名空间名称(因为将来如果集群中有更多应用程序命名空间,我必须每次编辑此脚本)。
这意味着我想删除集群中的所有命名空间,除了 kube-system
类似的东西 - kubectl delete namespace -v kube-system
(我知道-v
这里不是一个有效的参数,只是展示了 grep-v
是如何使用除了以下单词的。寻找类似的东西kubectl delete ns...
)
我有一个在 AWS EKS 上运行的 Rancher 2.5 集群。我的 CI 是通过一个到 Github 存储库的 webhook 在 CodeBuild 中完成的。buildspec.yml 可以很好地运行构建,标记容器,然后将它们发送到我在 AWS ECR 上的私有注册表,但我还没有找到一种简单的方法来触发集群上的部署更新以让它知道新的容器版本可用。我怎么做?
概括:
我有一个运行 kubectl port-forward 的 docker 容器,它将作为 k8s 服务运行的 postgres 服务的端口(5432)转发到本地端口(2223)。在 Dockerfile 中,我已经暴露了相关的 2223 端口。然后我通过发布所述端口 ( -p 2223:2223
)来运行容器
现在,当我尝试通过 访问 postgrespsql -h localhost -p 2223
时,出现以下错误:
psql: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
但是,当我docker exec -ti
对上述容器执行上述操作并运行上述 psql 命令时,我可以连接到 postgres。
Dockerfile 命令:
EXPOSE 2223
CMD ["bash", "-c", "kubectl -n namespace_test port-forward service/postgres-11-2 2223:5432"]
Docker 运行命令:
docker run -it --name=k8s-conn-12 -p 2223:2223 my_image_name:latest
docker run 命令的输出:
Forwarding from 127.0.0.1:2223 -> 5432
所以端口转发成功,我可以从 docker 容器内部连接到 postgres 实例。我不能做的是从容器外部连接到暴露和发布的端口
在我的集群中将我的 pod 扩展到 20 个,当我看到第二天重新创建了几个缩放的 pod 时。
当我说 POD 重新创建时,它会被删除并重新创建,并且重新创建的 pod 和缩放的 pod 的时间戳会有所不同。
我无法找到重新创建 POD 的原因。
当 POD 被删除并消失时,我找不到要重新创建的 POD。journalctl 中没有关于重新创建 POD 的日志。有什么方法可以进一步调试以找到重新创建 POD 的原因。或 POD 被删除的原因可能是什么。
注意:我已经定义了就绪和活跃度探测器,但这些探测器将作用于容器并且不会导致 POD 重新创建,这是我的理解。
当使用来自 kubernetes(基于 EKS)集群内部kubectl
的映像运行命令时,我希望该命令能够获取环境变量并连接到本地集群以运行命令。具体来说,我正在使用它在集群上运行一些内务处理,但容器只是出错(并最终进入 crashBackoff 循环)。bitnami/kubectl
KUBERNETES_SERVICE_HOST
KUBERNETES_SERVICE_PORT
kubernetes cronjobs
容器日志中的错误消息如下:
与服务器 localhost:8080 的连接被拒绝 - 您是否指定了正确的主机或端口?
这localhost:8080
特别奇怪,因为它从未使用过,并且在我知道的任何地方都没有配置 - 切换到简单的 shell 命令可以让作业成功运行,但 kubectl 拒绝工作。运行env
确认KUBE
变量确实被注入并正确设置。最近唯一的变化是将这些作业移动到由terraform kubernetes cronjob 资源管理,而不是直接通过 YAML 文件管理。每个 cronjob 都与具有适当权限的服务帐户相关联,并且仍然在 cronjob 中正确配置。
作为参考,这里是 cronjob 的略微编辑版本:
resource "kubernetes_cron_job" "test_cronjob" {
provider = kubernetes.region
metadata {
name = "test-cronjob"
namespace = "default"
}
spec {
concurrency_policy = "Allow"
failed_jobs_history_limit = 5
schedule = "*/5 * * * *"
job_template {
metadata {}
spec {
backoff_limit = 2
parallelism = 1
completions = 1
template {
metadata {}
spec {
container {
name = "kubectl"
image = "bitnami/kubectl"
command = ["/bin/sh", "-c", <<-EOT
env && echo "test";
EOT
]
}
restart_policy = "OnFailure"
service_account_name = "sa-test"
}
}
}
}
}
}