我在 coreos 上运行 kubernetes 集群。
我有一个运行良好的 kubernetes 复制控制器。它看起来像这样:
id: "redis-controller"
kind: "ReplicationController"
apiVersion: "v1beta3"
metadata:
name: "rediscontroller"
lables:
name: "rediscontroller"
spec:
replicas: 1
selector:
name: "rediscontroller"
template:
metadata:
labels:
name: "rediscontroller"
spec:
containers:
- name: "rediscontroller"
image: "redis:3.0.2"
ports:
- name: "redisport"
hostPort: 6379
containerPort: 6379
protocol: "TCP"
Run Code Online (Sandbox Code Playgroud)
但是我为上述复制控制器的 pod 提供了一个服务,如下所示:
id: "redis-service"
kind: "Service"
apiVersion: "v1beta3"
metadata:
name: "redisservice"
spec:
ports:
- protocol: "TCP"
port: 6379
targetPort: 6379
selector:
name: "redissrv"
createExternalLoadBalancer: true
sessionAffinity: "ClientIP"
Run Code Online (Sandbox Code Playgroud)
kube-proxy 的日志对服务有这样的说法:
Jul 06 …Run Code Online (Sandbox Code Playgroud) 嘿嘿,我需要一些帮助来让仪表板正常工作。我的仪表板 Pod 的状态为“待处理”,如果我对http://127.0.0.1:8080/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard进行curl 调用,则会得到以下结果:
“没有可用于服务\“kubernetes-dashboard\”的端点”
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "no endpoints available for service \"kubernetes-dashboard\"",
"reason": "ServiceUnavailable",
"code": 503
}
Run Code Online (Sandbox Code Playgroud)
所有吊舱
core@helena-coreos ~ $ ./kubectl get po --namespace=kube-system
NAME READY STATUS RESTARTS AGE
kube-apiserver-146.185.128.27 1/1 Running 0 5d
kube-apiserver-37.139.31.151 1/1 Running 0 7d
kube-controller-manager-146.185.128.27 1/1 Running 0 19h
kube-controller-manager-37.139.31.151 1/1 Running 0 16h
kube-dns-v11-ika0m 0/4 Pending 0 19h
kube-proxy-146.185.128.27 1/1 Running 0 5d
kubernetes-dashboard-1775839595-1h0lt 0/1 Pending 0 19h
Run Code Online (Sandbox Code Playgroud)
描述 Pod:
core@helena-coreos ~ …Run Code Online (Sandbox Code Playgroud) 我有一个 Kubernetes 集群(v1.5.6),在 vmware 上有 3 个节点的 etcd 集群(etcd 版本 3.1.5)。此 etcd 节点在 vmware 上的 coreos 上的三个 docker 容器(在三个主机上)中运行。
我尝试使用以下解决方案备份 etcd:
docker run --rm --net=host -v /tmp:/etcd_backup -e ETCDCTL_API=3 quay.io/coreos/etcd:v3.1.5 etcdctl --endpoints=[1.1.1.1:2379,2.2.2.2:2379,3.3.3.3:2379] snapshot save etcd_backup/snapshot.db
Run Code Online (Sandbox Code Playgroud)
备份已成功完成。
我想在另一个 vmware 环境中从零开始创建这个 kubernetes 集群,但我需要为此从快照恢复 etcd。
到目前为止,我还没有找到适用于 docker 容器中的 etcd 的正确解决方案。
我尝试使用以下方法恢复,但不幸的是我没有成功。
首先,我在运行以下命令后创建了一个新的 etcd 节点:
docker run --rm --net=host -v /tmp/etcd_bak:/etcd_backup -e ETCDCTL_API=3 registry:5000/quay.io/coreos/etcd:v3.1.5 etcdctl snapshot restore etcd_backup/snapshot.db --name etcd0 --initial-cluster etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380 --initial-cluster-token etcd-cluster-1 --initial-advertise-peer-urls http://etcd0:2380
Run Code Online (Sandbox Code Playgroud)
结果:
2018-06-04 09:25:52.314747 I | etcdserver/membership: added member …Run Code Online (Sandbox Code Playgroud) 我需要能够部署一个新容器或管理另一个正在运行的Docker容器在CoreOS中运行的Docker容器。
docker版本是1.5.0 coreos版本是647.2.0
现在,我用于部署应用程序新实例的过程是使用Shell脚本。
它基本上可以做到:
我在想,是否有可能从容器内部执行shell脚本,以便它在coreos中部署新的容器,或者该方法是否有替代方法。
另一个目标是能够停止正在运行的容器。
任何意见或建议,将不胜感激。
我完全意识到CoreOS主要是不可变的,所以在用户空间中没有安装任何东西.对于99%的用例,我同意.当我需要完成一些实际的工作时,我正在使用CoreOS /工具箱,但我还需要稍微更新用户环境,以便我可以正确地使用Docker-ify我的开发环境.
我试图了解在etcd上的“原子”更新是什么。
当我认为“原子”时,我认为有一个“之前”和“之后”(没有“期间”,并且如果更新失败,则仍然是“之前”)。
这是一个例子:
curl -s -XPUT http://localhost:2379/v2/keys/message -d value='Hidee Ho'
Run Code Online (Sandbox Code Playgroud)
因此,在这一点上,任何人都可以访问该消息并获取当前值:
curl -s http://localhost:2379/v2/keys/message
{"action":"get","node":{"key":"/message","value":"Hidee Ho","modifiedIndex":4748,"createdIndex":4748}}
Run Code Online (Sandbox Code Playgroud)
稍后,我可以修改该值,如下所示:
curl -s -XPUT http://localhost:2379/v2/keys/message -d value='Mr Hanky'
Run Code Online (Sandbox Code Playgroud)
结果可以像以前一样获取。更改之前,值“ Hidee Ho”回来,更改之后,值“ Mr Hanky”回来。所以,我的问题是我可以保证其中一个或另一个结果吗?也就是说,我想确认一个或另一个将被返回(而不是结果之间的nil值)。
我并不特别在意时间。如果我进行Hanky先生更新,并且随后的值获取程序继续在短时间内获得Hidee Ho,那就可以了。
我很困惑,因为协议中有一个Atomic CompareAndSwap函数。据我所知,它不是原子的,而是“仅当值是我所说的时才进行更新”。就我而言,我并不在乎过去的价值。我只想知道它已更改,除了“ before”或“ after”值之外,没有其他读者会看到。
据我了解,kube-proxy在每个Kubernetes节点上运行(它在Master和Worker节点上启动)
如果我理解正确,它也是访问API的"推荐"方式(请参阅:https://github.com/kubernetes/kubernetes/blob/release-1.0/docs/user-guide/accessing-the-cluster. md#access-the-api-from-a-pod)
那么,既然kube-proxy已经在每个节点上运行,那么"推荐"的方式是用一个新的kube-proxy容器启动每个pod,还是可以以某种方式"链接"到正在运行的kube-proxy容器?
最初我在$ GUB上使用带有$ KUBERNETES_SERVICE_HOST的URL和作为Secret传递的凭据,调用
curl https://$USER:$PASSWORD@${KUBERNETES_SERVICE_HOST}/api/v1/namespaces/${NAMESPACE}/endpoints/${SELECTOR}
Run Code Online (Sandbox Code Playgroud)
并解析结果,但在部署在CoreOS集群上的K8上,我似乎只能通过TLS和证书进行身份验证,而链接代理似乎是一种更好的方式.
所以,我正在寻找从pod连接到API以查找服务引用的另一个pod的IP的最有效/最简单的方法.
有什么建议/意见吗?
我在DigitalOcean上托管的coreOs集群上使用KUbernetes.并使用此 repo进行设置.我使用以下行启动apiserver:
/opt/bin/kube-apiserver --runtime-config=api/v1 --allow-privileged=true \
--insecure-bind-address=0.0.0.0 --insecure-port=8080 \
--secure-port=6443 --etcd-servers=http://127.0.0.1:2379 \
--logtostderr=true --advertise-address=${COREOS_PRIVATE_IPV4} \
--service-cluster-ip-range=10.100.0.0/16 --bind-address=0.0.0.0
问题是它接受任何人的请求!我希望能够提供简单的用户/密码身份验证.我一直在读这个和这个似乎我必须做类似下面的事情,但是我不能长时间地关闭集群,所以我需要你的帮助这个.Btw,mt pods不要创建另一个pod,所以我只需要一些用户,比如1/2 for devs和1 for CI.
我正在考虑做一些类似于包括授权模式和授权策略文件标志的东西,因为它似乎需要并使insecure-bind-address localhost使其仅在本地可用.我错过了什么?
/opt/bin/kube-apiserver --runtime-config=api/v1 --allow-privileged=true \
--authorization-mode=ABAC --authorization-policy-file=/access.json \
--insecure-bind-address=127.0.0.1 --insecure-port=8080 \
--secure-port=6443 --etcd-servers=http://127.0.0.1:2379 \
--logtostderr=true --advertise-address=${COREOS_PRIVATE_IPV4} \
--service-cluster-ip-range=10.100.0.0/16 --bind-address=0.0.0.0
{"user":"admin"}
{"user":"wercker"}
{"user":"dev1"}
{"user":"dev2"}
但是密码在哪里?如何使用kubectl和curl或httpie实际发出请求?
我已经在我的kubernetes api-server上实现了基本身份验证,现在我尝试以./kube/config一种我可以简单运行的方式配置我的文件,kubectl get pods
kubectl config set-cluster digitalocean \
--server=https://SERVER:6443 \
--insecure-skip-tls-verify=true \
--api-version="v1"
kubectl config set-context digitalocean --cluster=digitalocean --user=admin
kubectl config set-credentials admin --password="PASSWORD"
kubectl config use-context digitalocean
Run Code Online (Sandbox Code Playgroud)
但现在,它要求两次凭证:
dev@desktop: ~/code/go/src/bitbucket.org/cescoferraro
$ kubectl get pods
Please enter Username: admin
enter Password: PASSWORD
Please enter Username: admin
Please enter Password: PASSWORD
NAME READY STATUS RESTARTS AGE
Run Code Online (Sandbox Code Playgroud)
或者我需要传递旗帜
kubectl get pods --username=admin --password=PASSWORD
Run Code Online (Sandbox Code Playgroud)
这是默认行为吗?我希望我的配置能够了解我.我能做什么?
我kubectl exec在启用了k8s 1.6.4 RBAC的群集上进行了尝试,返回的错误是:error: unable to upgrade connection: Unauthorized。docker exec在同一容器上成功。否则,kubectl正在工作。kubectl通过SSH连接建立隧道,但我认为这不是问题。
已启用kubelet身份验证,但未启用authz。该文档说的authz是AlwaysAllow默认情况下,所以我离开了这种方式。
我感觉它类似于这个问题。但是错误消息有点不同。
提前致谢!
该kubectl exec命令的详细日志:
I0614 16:50:11.003677 64104 round_trippers.go:398] curl -k -v -XPOST -H "X-Stream-Protocol-Version: v4.channel.k8s.io" -H "X-Stream-Protocol-Version: v3.channel.k8s.io" -H "X-Stream-Protocol-Version: v2.channel.k8s.io" -H "X-Stream-Protocol-Version: channel.k8s.io" https://localhost:6443/api/v1/namespaces/monitoring/pods/alertmanager-main-0/exec?command=%2Fbin%2Fls&container=alertmanager&container=alertmanager&stderr=true&stdout=true
I0614 16:50:11.003705 64104 round_trippers.go:398] curl -k -v -XPOST -H "X-Stream-Protocol-Version: v4.channel.k8s.io" -H "X-Stream-Protocol-Version: v3.channel.k8s.io" -H "X-Stream-Protocol-Version: v2.channel.k8s.io" -H "X-Stream-Protocol-Version: channel.k8s.io" -H "User-Agent: kubectl/v1.6.4 (darwin/amd64) kubernetes/d6f4332" https://localhost:6443/api/v1/namespaces/monitoring/pods/alertmanager-main-0/exec?command=%2Fbin%2Fls&container=alertmanager&container=alertmanager&stderr=true&stdout=true
I0614 16:50:11.169474 …Run Code Online (Sandbox Code Playgroud)