- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一年前我用外部 etcd 集群(3 个成员)创建了一个 Kubernetes 集群。
有一次,我不知道可以在内部创建一个 etcd,所以我创建了一个外部集群并将 Kubernetes 连接到它。
现在我看到内部集群是一个东西,它是一个更清晰的解决方案,因为当您更新 Kubernetes 集群时,etcd 节点也会更新。
我找不到将外部 etcd 集群迁移到内部集群的干净解决方案。我希望有一个零停机时间的解决方案。请问你知道有没有可能?
感谢您的回复,祝您有美好的一天!
最佳答案
据我所知,从 Kubernetes 集群的角度来看,您有 3 个 etcd 集群成员。预期的结果是让所有三个成员都在 Kubernetes 主节点上运行。
有一些信息未公开,所以我尝试解释几种可能的选择。
首先,有几种合理的方法可以运行 etcd 进程以用作 Kubernetes 控制平面键值存储:
/etc/kubernetes/manifests/etcd.yaml
中有启动配置文件 /etc/systemd/system/etcd.service
中定义的系统服务运行或类似文件 To migrate a member:
- Stop the member process.
- Copy the data directory of the now-idle member to the new machine.
- Update the peer URLs for the replaced member to reflect the new machine according to the runtime reconfiguration instructions.
- Start etcd on the new machine, using the same configuration and the copy of the data directory.
# last two commands only show you members specified by using --endpoints command line option
# the following commands is suppose to run with root privileges because certificates are not accessible by regular user
e2 cluster-health
e3 endpoint health
e3 endpoint status
0.2 检查每个etcd成员配置并找出 etcd data-dir 所在的位置,然后确保它在 etcd 进程终止后仍然可以访问。在大多数情况下,它位于主机上的/var/lib/etcd 下,直接使用或作为卷安装到 etcd pod 或 docker 容器。
kubelet
按照建议启动 etcd
here , 搬家
etcd.yaml
文件超出
/etc/kubernetes/manifests/
.紧接着,etcd Pod 将被
kubelet
终止:
sudo mv /etc/kubernetes/manifests/etcd.yaml ~/
sudo chmod 644 ~/etcd.yaml
如果您启动 etcd 进程
as a systemd service您可以使用以下命令停止它:
sudo systemctl stop etcd-service-name.service
如果是 docker 容器,您可以使用以下命令停止它:
docker ps -a
docker stop <etcd_container_id>
docker rm <etcd_container_id>
如果从命令行运行 etcd 进程,则可以使用以下命令终止它:
kill `pgrep etcd`
2. 将 now-idle 成员的数据目录复制到新机器上。
tar -C /var/lib -czf etcd-member-name-data.tar.gz etcd
tar -czf etcd-member-name-conf.tar.gz [etcd.yaml] [/etc/systemd/system/etcd.service] [/etc/kubernetes/manifests/etcd.conf ...]
scp etcd-member-name-data.tar.gz destination_host:~/
scp etcd-member-name-conf.tar.gz destination_host:~/
3. 更新被替换成员的对等 URL 根据运行时重新配置说明反射(reflect)新成员 IP 地址。
etcd API
或通过运行
etcdctl
公用事业。
etcdctl
方式可能看起来像:
# all etcd cluster members should be specified
export ETCDSRV="--endpoints https://etcd.ip.addr.one:2379,https://etcd.ip.addr.two:2379,https://etcd.ip.addr.three:2379"
#authentication parameters for v2 and v3 etcdctl APIs
export ETCDAUTH2="--ca-file /etc/kubernetes/pki/etcd/ca.crt --cert-file /etc/kubernetes/pki/etcd/peer.crt --key-file /etc/kubernetes/pki/etcd/peer.key"
export ETCDAUTH3="--cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key"
# etcdctl API v3 alias
alias e3="ETCDCTL_API=3 etcdctl $ETCDAUTH3 $ETCDSRV"
# etcdctl API v2 alias
alias e2="ETCDCTL_API=2 etcdctl $ETCDAUTH2 $ETCDSRV"
# list all etcd cluster members and their IDs
e2 member list
e2 member update member_id http://new.etcd.member.ip:2380
#or
e3 member update member_id --peer-urls="https://new.etcd.member.ip:2380"
就是这样
etcd API
方式可能看起来像:
export CURL_ETCD_AUTH="--cert /etc/kubernetes/pki/etcd/peer.crt --key /etc/kubernetes/pki/etcd/peer.key --cacert /etc/kubernetes/pki/etcd/ca.crt"
curl https://health.etcd.istance.ip:2379/v2/members/member_id -XPUT -H "Content-Type: application/json" -d '{"peerURLs":["http://new.etcd.member.ip:2380"]}' ${CURL_ETCD_AUTH}
4.在新机器上启动etcd ,使用调整后的配置和数据目录的副本。
tar -xzf etcd-member-name-data.tar.gz -C /var/lib/
根据需要调整 etcd 启动配置。此时很容易选择另一种运行 etcd 的方式。根据您的选择,准备 list 或服务定义文件,并将旧 IP 地址替换为新 IP 地址。例如。:
sed -i 's/\/10.128.0.12:/\/10.128.0.99:/g' etcd.yaml
现在是时候通过移动
etcd.yaml
来启动 etcd至
/etc/kubernetes/manifests/
,或通过运行以下命令(如果您将
etcd
作为
systemd
服务运行)
sudo systemctl start etcd-service-name.service
5. 检查更新的 etcd 进程日志和 etcd 集群健康 以确保成员(member) body 健康。
$ e2 cluster-health
$ kubectl logs etct_pod_name -n kube-system
$ docker logs etcd_container_id 2>&1 | less
$ journalctl -e -u etcd_service_name
关于kubernetes - 在 Kubernetes 集群中,有没有办法将 etcd 从外部迁移到内部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54342705/
我需要为打开的 xlsx 文件取消隐藏工作表 TAB,为此,我使用 VBS 文件打开 xlsm 文件并激活宏(位于模块中)。 当我手动运行宏时,它可以工作。 当它通过vbs激活时,它只能看到包含宏的x
我正在使用 Google Cloud Compute Engine 安装气流并使其保持正常运行。安装很好,现在它在主机上运行:0.0.0.0:8080 我有此 VM 实例的外部 IP 地址,但是我无法
我们可以在 GWT 中使用这个 $entry 方法来允许外部 javascript 执行 java 方法。 你可以在他们的文档 https://developers.google.com/web-to
在 Cython 的“Hello World”和 C 数学库中调用函数的示例之后 here ,我真正想做的是将我自己的 C 代码放在一个单独的文件中,并在 Cython 中使用它。关注 this ,我
我一直在试验 JSON Pointers引用和重用 JSON schemas . 按照示例,我能够引用在另一个 JSON 模式中声明的特定属性,一切都按预期进行,但是我还没有找到一种方法来扩展基本 J
我正在使用 X.jar 并添加到我的 AspectJ 项目(在 eclipse 中)。我已经为 X.jar 中的 myMethod() 方法编写了切入点和建议。 但是aspectj 并没有拦截这个方法
我正在 Controller 中创建一个自定义指令,并在 ng-repeat 中调用它,如下所示: HTML: JS: 在测试指令中,我按如下方式调用 loadDat
我正在尝试加载服务器上本地存在的 HTML 页面,位于名为 HTML-FIles 的文件夹中。 我想使用 jquery 加载一个文件并将其内容显示在 div 中。 现在,我可以加载文件,但在 div
我正在尝试根据初始选择从 JSON 文件生成选择菜单。我见过很多不同的方式,人们为此编写了一个函数,但想要一些非常简单的东西。 HTML: Please select Practis
我的目标是从 HTML 文档中获取文本,该文档不会调用 .jsp 文件中的任何函数。 我环顾四周,我以为我已经找到了问题的答案,但它似乎不起作用,其他答案包括使用 jQuery(我既不熟悉也不允许使用
我正在尝试从外部 JSON 文件获取文件内容,但我一直在警报中收到 null。 JS: function getText() { var result = null; var file
我正在加载一个外部 javascript 文件,该文件仅填充有 int 或字符串或 bool 值或数组的变量。类似... varBool=false; var1="var1"; var2="var2:
我的数据存储在外部 Javascript 文件中。 看起来像这样, window.videos = [{ "name": "Sample data", "duration": 154,
我有一个包含 Google ADWords 的 HTML 页面,以及来自外部 URL 的 ajax 调用,我想获取 json 来自 url 的数据。外部API也是我做的。API Controller
我试图看看是否有一种简单的方法可以通过外部 JavaScript 函数访问 Controller 的内部范围(与目标 Controller 完全无关) 我在这里看到了其他几个问题 angular.el
我尝试在运行外部命令时终止脚本,结果出现错误。考虑这个简单的代码: try { where.exe Test-App } catch { Write-Error "Exception
我在 test.js 中定义了一个外部 JS 函数 function InvokeSupport(ID, TimeStamp, Hash) { var sUrl = '' + "?uid="
如果我想将变量从外部 js 文件提取到另一个外部 js 文件。我该怎么做? 例如,如果我有一个名为 example1.js 的文件,其中包含以下代码 var test = 1; 如何获取变量 tes
我正在尝试使用 java 从外部 jar 中读取文件..例如,我有两个 jar 文件。一个是“foo.jar”,另一个是“bar.jar”。 “bar.jar”内部是文件“foo-bar.txt”。如
在我的 Java 应用程序中,我希望从未实际加载的类文件以及也未加载的 jar 文件中读取字节码内容。理想情况下,我需要能够获取任何给定的 jarfile,并找到其中的所有类。因此,考虑以下情况: 我
我是一名优秀的程序员,十分优秀!