我是k8s的新手,我在这里遇到了一个小问题.
这是上下文:我需要kubectl delete [podname]
每天通过crontask 调用一次,并等到k8s重新创建pod,然后登录该pod中的容器并运行shell命令.
所以我查询部署并得到这样的东西:
user@host:~$ kubectl get pods
NAME READY STATUS RESTARTS AGE
firstpod-123456789-something 1/1 Running 570 2d
secondpod-http-backend-something 1/1 Running 597 2d
Run Code Online (Sandbox Code Playgroud)
然后我写了一个bash脚本,它会在5分钟的时间间隔内删除pod.这很容易.
假设我调用kubectl delete firstpod-123456789-something
并等待k8s重新创建一个新的pod.那个新的pod会有一个新的名字firstpod-[some random hash here]-something
问题是我需要在我的bash脚本中捕获该pod的名称,这样我就可以在该pod中执行命令,uname -a
或者无论如何验证新pod已启动并运行正常.
我用谷歌搜索并阅读了kubectl文档,但我认为通过bash脚本有一种简单的方法可以做到这一点?我假设在这里获取pod名称的唯一方法是通过k8s API?
我很高兴在这一点上使用任何解决方案.我想知道当k8s产生新的pod时,我是否有任何重命名新pod的方法?所以我可以grep一个特定的关键字?
请注意,我不想firstpod-[0-9]-something
因为那只是一个例子而得到了一些东西.很多豆荚有很多不同的名字,这只是一个例子.
谢谢!
我执行了以下命令: % kubectl get service
它返回了使用kubectl在某个时间点创建的服务列表:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
car-example-service 10.0.0.129 <nodes> 8025:31564/TCP,1025:31764/TCP 10h
circle-example-service 10.0.0.48 <nodes> 9000:30362/TCP 9h
demo-service 10.0.0.9 <nodes> 8025:30696/TCP,1025:32047/TCP 10h
example-servic 10.0.0.168 <nodes> 8080:30231/TCP 1d
example-service 10.0.0.68 <nodes> 8080:32308/TCP 1d
example-service2 10.0.0.184 <nodes> 9000:32727/TCP 13h
example-webservice 10.0.0.35 <nodes> 9000:32256/TCP 1d
hello-node 10.0.0.224 <pending> 8080:32393/TCP 120d
kubernetes 10.0.0.1 <none> 443/TCP 120d
mouse-example-service 10.0.0.40 <nodes> 9000:30189/TCP 9h
spring-boot-web 10.0.0.171 <nodes> 8080:32311/TCP 9h
spring-boot-web-purple 10.0.0.42 <nodes> 8080:31740/TCP 9h
Run Code Online (Sandbox Code Playgroud)
我不再希望列出任何这些服务,因为当我列出资源时:
% kubectl get rs
我期望只看到列出的spring-boot-web资源。
NAME DESIRED CURRENT …
Run Code Online (Sandbox Code Playgroud) 将我的服务部署到生产中:
envsubst < ./kubernetes/pre-production/aks.yaml | kubectl apply -f -
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
部署"moverick-mule-pre"无效:spec.template.metadata.labels:无效值:map [string] string {"commit":"750a26deebc3582bec4bfbb2426b3f22ee042eaa","app":"moverick-mule-pre"}:
selector
与模板不匹配labels
我的yaml文件是:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: moverick-mule-pre
spec:
replicas: 2
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
template:
metadata:
labels:
app: moverick-mule-pre
commit: $CI_COMMIT_SHA
spec:
containers:
- name: moverick-mule-pre
image: $REGISTRY_SERVER_PRE/$CI_PROJECT_NAME:$CI_COMMIT_REF_NAME
imagePullPolicy: Always
ports:
- containerPort: 80
envFrom:
- secretRef:
name: moverick-pre
livenessProbe:
httpGet:
path: /console
port: 80
initialDelaySeconds: 5
periodSeconds: 5
volumeMounts:
- name: logs
mountPath: /opt/mule/logs/
- name: asc …
Run Code Online (Sandbox Code Playgroud) 我kubernetes 1.12.1
在云虚拟机中安装了两个节点,都在 Internet 代理后面。每个 VM 都有关联的浮动 IP 以通过 SSH 进行连接,它们kube-01
是一个主kube-02
节点,也是一个节点。执行导出:
no_proxy=127.0.0.1,localhost,10.157.255.185,192.168.0.153,kube-02,192.168.0.25,kube-01
Run Code Online (Sandbox Code Playgroud)
在运行之前kubeadm init
,但我收到以下状态kubectl get nodes
:
NAME STATUS ROLES AGE VERSION
kube-01 NotReady master 89m v1.12.1
kube-02 NotReady <none> 29s v1.12.2
Run Code Online (Sandbox Code Playgroud)
我缺少任何配置吗?我需要在各自的 VM 中添加192.168.0.153
和吗?192.168.0.25
/etc/hosts
我正在尝试为应用程序完成一项非常常见的任务:
分配证书并使用TLS/HTTPS保护它.
我花了近一天时间通过文档搜索并尝试了多种不同的策略来实现这一点,但没有什么对我有用.
最初我使用Helm在EKS上设置nginx-ingress,遵循以下文档:https://github.com/nginxinc/kubernetes-ingress.我尝试使用以下配置使示例应用程序工作(咖啡馆):
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: cafe-ingress
spec:
tls:
- hosts:
- cafe.example.com
secretName: cafe-secret
rules:
- host: cafe.example.com
http:
paths:
- path: /tea
backend:
serviceName: tea-svc
servicePort: 80
- path: /coffee
backend:
serviceName: coffee-svc
servicePort: 80
Run Code Online (Sandbox Code Playgroud)
入口和所有支持的服务/部署工作正常,但有一个主要的缺失:入口没有相关的地址/ ELB:
NAME HOSTS ADDRESS PORTS AGE
cafe-ingress cafe.example.com 80, 443 12h
Run Code Online (Sandbox Code Playgroud)
Service LoadBalancers创建ELB资源,即:
testnodeapp LoadBalancer 172.20.4.161 a64b46f3588fe... 80:32107/TCP 13h
Run Code Online (Sandbox Code Playgroud)
但是,Ingress没有创建地址.如何在EKS上外部暴露出Ingress控制器来处理TLS/HTTPS?
运行后:
docker network rm $NETNAME
docker network create --driver bridge $NETNAME --subnet "${SUBNET}0/24"
docker run --name $NODENAME -it --net $NETNAME --ip 192.168.0.2 --volume --detach $IMGNAME
Run Code Online (Sandbox Code Playgroud)
在容器中,以root身份运行apk udpdate
:
# apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.7/main: Bad file descriptor
WARNING: Ignoring APKINDEX.70c88391.tar.gz: Bad file descriptor
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.7/community: Bad file descriptor
WARNING: Ignoring APKINDEX.5022a8a2.tar.gz: Bad file descriptor
2 errors; 33 distinct packages available
Run Code Online (Sandbox Code Playgroud)
...并击中Bad file descriptor
错误。
还有许多其他人遇到相同的错误:
有关如何解决此问题的建议,范围如下:
“这是一个DNS查找错误。只需将google DNS服务器(8.8.8.8、8.8.4.4)添加到Docker主机的守护进程配置文件中即可。”
... 至 ...
“将以下内容添加到您的Dockerfile:”
RUN …
我设计了一个 docker-compose.yml
文件,它也应该与单个卷一起使用....
我创建了一个安装/dataraid
在我的系统上的 RAID 驱动器。我可以读/写系统,但是在我的撰写文件中使用它时,我收到read-only file system
错误消息.....将卷调整到其他路径,如/home/myname/test
撰写文件工作....
我不知道是什么/dataraid
使它“只读”。
什么是权限设置组合文件需要?
错误信息:
ERROR: for db Cannot start service db: error while creating mount source path '/dataraid/nextcloud/mariadb': mkdir /dataraid: read-only file system
Run Code Online (Sandbox Code Playgroud)
撰写:
version: '3'
services:
db:
image: mariadb
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
restart: always
volumes:
- /dataraid/nextcloud/mariadb:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=PASSWORD
env_file:
- db.env
redis:
image: redis
restart: always
app:
image: nextcloud:fpm
restart: always
volumes:
- /dataraid/nextcloud/html:/var/www/html
environment:
- MYSQL_HOST=db
env_file:
- db.env
depends_on:
- …
Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个 docker 容器,但收到以下错误消息:
Step 8/12 : RUN bundle binstubs bundler --force
---> Running in ed94b127974b
Could not find gem 'rails (>= 5.1.5, ~> 5.1)' in any of the gem sources listed
in your Gemfile.
ERROR: Service 'dockerzon' failed to build: The command '/bin/sh -c bundle binstubs bundler --force' returned a non-zero code: 7
Run Code Online (Sandbox Code Playgroud)
我在 Gemfile 中尝试过不同版本的 Rails,但没有成功!这是我的 Gemfile 中的内容:
source 'https://rubygems.org'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
# gem 'rails', '4.2.6'
# gem 'rails', '>= 5.1.5'
gem …
Run Code Online (Sandbox Code Playgroud) 我将健康检查添加到我的 Dockerfile 中:
HEALTHCHECK --interval=1m --timeout=5s --retries=2 --start-period=10s \
CMD wget -qO- http://localhost:8070/healthcheck || exit 1
Run Code Online (Sandbox Code Playgroud)
在我的项目主 urls.py 文件中,我添加了条目:
url(r'^healthcheck/', lambda r: HttpResponse())
Run Code Online (Sandbox Code Playgroud)
该项目已激活并部署,因此我可以理解运行状况检查是有效的,但是 - 我不断收到:
2017-12-17 13:25:27,891 警告基地 51 140551932685128 未找到:/healthcheck
写入日志(每分钟一次)。当我从服务器内部运行 wget 时,也会添加日志条目。
是否是 healthcheck 语法、django 条目设置或 docker 中的 wget 有问题?
请协助。谢谢。
我想为我的 docker 映像安装 libwebp 依赖项。如何使用 docker 文件下载并安装 libwebp?一种方法是您可以下载 libwebp 和 ADD 文件到映像,如下所示。
ADD resources/vts/libwebp-0.4.1-linux-x86-64 /lib/libwebp-0.4.1-linux-x86-64
Run Code Online (Sandbox Code Playgroud)
但我需要通过运行这样的命令来安装它。
RUN apk upgrade -U \ && apk add ca-certificates ffmpeg \ && rm -rf/var/cache/*
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?我参考下图来创建我的 docker 文件
FROM openjdk:8-jdk-alpine
Run Code Online (Sandbox Code Playgroud) docker ×5
kubernetes ×4
kubectl ×3
alpine-linux ×2
dockerfile ×2
amazon-eks ×1
deployment ×1
devops ×1
django ×1
kubeadm ×1
linux ×1
python ×1
ruby ×1
rubygems ×1
wget ×1