kubernetes 教程(一) etcd安装

本文详细介绍如何在Kubernetes环境中安装etcd服务。包括下载安装包、配置etcd.service文件及配置项说明,同时提供了测试etcd集群状态的Go语言示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Kubernetes 环境搭建(一) etcd 安装


  • 下载安装包
    wget https://github.com/coreos/etcd/releases/download/v3.2.18/etcd-v3.2.18-linux-amd64.tar.gz
    并将安装下载的 etcd 和 etcdctl 放置于 /opt/kubernetes/bin 目录下。

  • 新建 etcd.service 文件,并放置于 /usr/lib/systemd/system/etcd.service。执行 systemctl enable etcd 开机启动,并新建目录/var/lib/etcd。

[Unit]
Description=Etcd Server
After=network.target

[Service]
Type=simple
WorkingDirectory=/var/lib/etcd
EnvironmentFile=-/opt/kubernetes/cfg/etcd.conf
ExecStart=/opt/kubernetes/bin/etcd \
        --name=${ETCD_NAME} \
        --listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \
        --listen-client-urls=${ETCD_LISTEN_CLIENT_URLS} \
        --initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS} \
        --initial-cluster=${ETCD_INITIAL_CLUSTER} \
        --initial-cluster-state=${ETCD_INITIAL_CLUSTER_STATE} \
        --initial-cluster-token=${ETCD_INITIAL_CLUSTER_TOKEN} \
        --advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \
        --data-dir=${ETCD_DATA_DIR}
LimitNOFILE=65536
Type=notify

[Install]
WantedBy=multi-user.target
  • 新增配置文件,放置于/opt/kubernetes/cfg/etcd.conf
#[member]
ETCD_NAME="etcd-node1"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#ETCD_SNAPSHOT_COUNTER="10000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
ETCD_LISTEN_PEER_URLS="http://172.16.66.172:2380"
ETCD_LISTEN_CLIENT_URLS="http://172.16.66.172:2379,http://127.0.0.1:2379"
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
#ETCD_CORS=""


#[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.16.66.172:2380"
#
ETCD_ADVERTISE_CLIENT_URLS="http://172.16.66.172:2379"
ETCD_INITIAL_CLUSTER="etcd-node1=http://172.16.66.172:2380,etcd-node2=http://172.16.66.173:2380,etcd-node3=http://172.16.66.174:2380"
ETCD_INITIAL_CLUSTER_TOKEN="k8s-etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

#[security]
#CLIENT_CERT_AUTH="true"
#ETCD_CA_FILE="/opt/kubernetes/ssl/ca.pem"
#ETCD_CERT_FILE="/opt/kubernetes/ssl/etcd.pem"
#ETCD_KEY_FILE="/opt/kubernetes/ssl/etcd-key.pem"
#PEER_CLIENT_CERT_AUTH="true"
#ETCD_PEER_CA_FILE="/opt/kubernetes/ssl/ca.pem"
#ETCD_PEER_CERT_FILE="/opt/kubernetes/ssl/etcd.pem"
#ETCD_PEER_KEY_FILE="/opt/kubernetes/ssl/etcd-key.pem"

TODO:不要在配置行末尾加注释,进程启动后会把注释附加到参数上,只可启行注释

  • 将对应的IP换成相关的etcd节点IP。
  • systemctl start etcd
  • etcdctl member list #查看etcd节点
  • 完成
  • 遇到的问题
    • 节点的IP 要配置正确
    • 要手动新建目录 /var/lib/etcd
    • ETCD_NAME 不要重复
    • ETCD_INITIAL_CLUSTER_TOKEN 要相同
    • 日志文件查看 /var/log/message
  • 测试etcd go 代码
    从etcd 设置和获取值
package main

import (
        "context"
        "fmt"
        "github.com/coreos/etcd/clientv3"
        "time"
)

func main() {
        cli, err := clientv3.New(clientv3.Config {
                Endpoints: []string{"172.16.66.172:2379", "172.16.66.173:2379", "172.16.66.174:2379"},
                DialTimeout: 5 * time.Second,
        })
        if err != nil {
                fmt.Println("connect failed, err:", err)
                return
        }
        fmt.Println("connect succ")
        defer cli.Close()

        //设置1秒超时, 访问etcd有超时控制
        ctx, cancel := context.WithTimeout(context.Background(), time.Second)
        //操作 etcd
        _, err = cli.Put(ctx, "/logagent/conf/", "sample_value")
        //操作完毕, 取消etcd
        cancel()
        if err != nil {
                fmt.Println("put failed, err:", err)
                return
        }
        //取值,设置超时1秒
        ctx, cancel = context.WithTimeout(context.Background(), time.Second)
        resp, err := cli.Get(ctx, "/logagent/conf/")
        cancel()
        if err != nil {
                fmt.Println("get failed, err:", err)
                return
        }
        for _, ev := range resp.Kvs {
                fmt.Println("[%s] : [%s]\n", ev.Key, ev.Value)
        }
}

watch etcd 代码

package main

import (
        "context"
        "fmt"
        "time"
        "github.com/coreos/etcd/clientv3"
)

func main() {
        cli, err := clientv3.New(clientv3.Config{
                Endpoints : []string{"172.16.66.172:2379", "172.16.66.173:2379", "172.16.66.174:2379"},
                DialTimeout: 5 * time.Second,
        })
        if err != nil {
                fmt.Println("connect failed, err:", err)
                return
        }
        fmt.Println("connect succ")
        defer cli.Close()

        cli.Put(context.Background(), "/logagent/conf/", "000000")
        for {
                rch := cli.Watch(context.Background(), "/logagent/conf/")
                for wresp := range rch {
                        for _, ev := range wresp.Events {
                                fmt.Printf("%s %q : %q\n", ev.Type, ev.Kv.Key, ev.Kv.Value)
                        }
                }
        }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值