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)
}
}
}
}