k8s 常见问题

[TOC]

自己在搭建k8s集群的时候遇到的问题,和解决方法记录下来.

1.etcd服务

kubernetes和flannel存储数据等,单台etcd不稳定,最好是搭建集群。搭建集群的时候,集群之间通信如果要添加认证的话,需要签署证书。同时把证书拷贝到制定文件目录,在etcd.service中制定证书文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
cat > etcd-csr.json <<EOF
{
"CN": "etcd",
"hosts": [
"127.0.0.1",
"${NODE_IP}"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF

cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \
-ca-key=/etc/kubernetes/ssl/ca-key.pem \
-config=/etc/kubernetes/ssl/ca-config.json \
-profile=kubernetes etcd-csr.json | cfssljson -bare etcd

mkdir -p /etc/etcd/ssl
cp etcd*.pem /etc/etcd/ssl

cd
mkdir -p /var/lib/etcd
cat > etcd.service <<EOF
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
Documentation=https://github.com/coreos

[Service]
Type=notify
WorkingDirectory=/var/lib/etcd/
ExecStart=/root/local/bin/etcd \\
--name=${NODE_NAME} \\
--cert-file=/etc/etcd/ssl/etcd.pem \\
--key-file=/etc/etcd/ssl/etcd-key.pem \\
--peer-cert-file=/etc/etcd/ssl/etcd.pem \\
--peer-key-file=/etc/etcd/ssl/etcd-key.pem \\
--trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\
--peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\
--initial-advertise-peer-urls=https://${NODE_IP}:2380 \\
--listen-peer-urls=https://${NODE_IP}:2380 \\
--listen-client-urls=https://${NODE_IP}:2379,http://127.0.0.1:2379 \\
--advertise-client-urls=https://${NODE_IP}:2379 \\
--initial-cluster-token=etcd-cluster-0 \\
--initial-cluster=${ETCD_NODES} \\
--initial-cluster-state=new \\
--data-dir=/var/lib/etcd
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

cp etcd.service /etc/systemd/system/

2.flannel网络

flannel网络也可以添加认证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
cat > flanneld-csr.json <<EOF
{
"CN": "flanneld",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF

cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \
-ca-key=/etc/kubernetes/ssl/ca-key.pem \
-config=/etc/kubernetes/ssl/ca-config.json \
-profile=kubernetes flanneld-csr.json | cfssljson -bare flanneld

mkdir -p /etc/flanneld/ssl
cp flanneld*.pem /etc/flanneld/ssl

#只需一次
--------------------------------------------------------------------------
/root/local/bin/etcdctl \
--endpoints=${ETCD_ENDPOINTS} \
--ca-file=/etc/kubernetes/ssl/ca.pem \
--cert-file=/etc/flanneld/ssl/flanneld.pem \
--key-file=/etc/flanneld/ssl/flanneld-key.pem \
set ${FLANNEL_ETCD_PREFIX}/config '{"Network":"'${CLUSTER_CIDR}'", "SubnetLen": 24, "Backend": {"Type": "vxlan"}}'
--------------------------------------------------------------------------

mkdir /atlas/backup/kubernetes-1.6.10/flannel
tar xf /atlas/backup/kubernetes-1.6.10/flannel-v0.7.1-linux-amd64.tar.gz -C /atlas/backup/kubernetes-1.6.10/flannel
cp /atlas/backup/kubernetes-1.6.10/flannel/{flanneld,mk-docker-opts.sh} /root/local/bin

cd
cat > flanneld.service << EOF

[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service
Before=docker.service

[Service]
Type=notify
ExecStart=/root/local/bin/flanneld \\
-etcd-cafile=/etc/kubernetes/ssl/ca.pem \\
-etcd-certfile=/etc/flanneld/ssl/flanneld.pem \\
-etcd-keyfile=/etc/flanneld/ssl/flanneld-key.pem \\
-etcd-endpoints=${ETCD_ENDPOINTS} \\
-etcd-prefix=${FLANNEL_ETCD_PREFIX}
ExecStartPost=/root/local/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=on-failure

[Install]
WantedBy=multi-user.target
RequiredBy=docker.service

EOF

cp flanneld.service /etc/systemd/system/

docker

在设置网络断的时候注意,yum安装的flannel,记得添加配置文件。启动flannel之前要先把之前docker启动的docker0 网络给删除。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ip link delete docker0

cat > /etc/sysconfig/flanneld <<EOF

FLANNEL_ETCD_ENDPOINTS="http://172.16.10.17:2379,http://172.16.10.13:2379,http://172.16.10.14:2379"
FLANNEL_ETCD_PREFIX="/flannel/network"
FLANNEL_OPTIONS="--iface=eth0"
EOF

etcdctl \
--endpoints=${ETCD_ENDPOINTS} \
--ca-file=/etc/kubernetes/ssl/ca.pem \
--cert-file=/etc/flanneld/ssl/flanneld.pem \
--key-file=/etc/flanneld/ssl/flanneld-key.pem \
set ${FLANNEL_ETCD_PREFIX}/config '{"Network":"'${CLUSTER_CIDR}'", "SubnetLen": 24, "Backend": {"Type": "vxlan"}}'

#查询
etcdctl \
--endpoints=${ETCD_ENDPOINTS} \
--ca-file=/etc/kubernetes/ssl/ca.pem \
--cert-file=/etc/flanneld/ssl/flanneld.pem \
--key-file=/etc/flanneld/ssl/flanneld-key.pem \
ls ${FLANNEL_ETCD_PREFIX}/subnets

在向etcd中写入pod网段信息的时候设置endpoints的时候,如果etcd启用认证,就需要加https,同时指定证书文件,否则只需使用http。

另外一个docker要注意的地方,在使用docker启动gitlab,如果要实现ldap认证用户登录,那么就不要用flannel网络将这个docker管理起来,用flannel设置的网络访问不了ldap的端口。所以集群上目前没有把login节点设置成一个node的原因。

docker.service中,最好是禁用掉iptables,加上--iptables=false 即可,如果不禁用掉则需要在kubelete服务中添加防火墙规则。yum安装的flannel要在docker中加入如下命令,以添加网络管理配置。

1
2
3
4
5
6
7
8
9
EnvironmentFile=-/run/flannel/docker
#清空防火墙
iptables -F
iptables -P FORWARD ACCEPT #添加防火墙默认规则
#kubelete添加防火墙规则
ExecStartPost=/sbin/iptables -A INPUT -s 10.0.0.0/8 -p tcp --dport 4194 -j ACCEPT
ExecStartPost=/sbin/iptables -A INPUT -s 172.16.0.0/12 -p tcp --dport 4194 -j ACCEPT
ExecStartPost=/sbin/iptables -A INPUT -s 192.168.0.0/16 -p tcp --dport 4194 -j ACCEPT
ExecStartPost=/sbin/iptables -A INPUT -p tcp --dport 4194 -j DROP

kubelet bootstrapping kubeconfig 文件,kube-proxy kubeconfig 文件。在一处创建之后,可以用在所有node节点。

集群上的kube-apiserver服务启用了rbac。

在kubedns 和kube-dashboard中,用到的images已经在配置中修改到国内的images上了。

一个培训机构的kubernetes学习课程,用来参考做学习:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
Chapter 1:课程介绍
理解 Kubernetes 设计原则、原理
了解 Kubernetes 的过去、现在和未来
了解并学会使用 Kubernetes 最重要的资源 -- API
学会如何创建和管理应用,并配置应用外部访问
理解 Kubernetes 网络、存储
掌握 Kubernetes 调度的原理和策略
Kubernetes 一些新功能的概念
了解 Kubernetes 的日志、监控方案
具备基本的故障排查的运维能力

Chapter 2:Kubernetes 基本概念
了解什么是 Kubernetes
了解 Kubernetes 的主要特性
理解为什么需要 Kubernetes
了解 Kubernetes 的过去、现在和未来
了解目前 Kubernetes 社区的情况和被采用情况
了解 Kubernetes 的基本架构
获得一些学习资料推荐

Chapter 3:Kubernetes 架构及原理
理解 Kubernetes 设计原则
深入理解 Kubernetes 集群中的组件及功能
了解 Kubernetes 集群对网络的预置要求
深入理解 Kubernetes 的工作原理
深入理解 Kubernetes 中 Pod 的设计思想


Chapter 4:Kubernetes 安装和配置
了解部署 Kubernetes 的多种方式
可以单机部署 Kubernetes(学习演示使用)
可以在宿主机部署一套 Kubernetes 集群(非生产使用)


Chapter 5:Kubernetes API 及集群访问
了解 Kubernetes 的 API
理解 Kubernetes 中 API 资源的结构定义
了解 kubectl 工具的使用
了解 Kubernetes 中 API 之外的其他资源


Chapter 6:ReplicaController,ReplicaSets 和 Deployments
理解 RC
理解 label 和 selector 的作用
理解 RS
理解 Deployments 并且可操作 Deployments
理解 rolling update 和 rollback

Chapter 7:Volume、配置文件及密钥
了解 Kubernetes 存储的管理,支持存储类型
理解 Pod 使用 volume 的多种工作流程以及演化
理解 pv 和 pvc 的原理
理解 storage class 的原理
理解 configmaps 的作用和使用方法
理解 secrets 的作用和使用方法资源结构

Chapter 8:Service 及服务发现
了解 Docker 网络和 Kubernetes 网络
了解 Flannel 和 Calico 网络方案
理解 Pod 在 Kubernetes 网络中的工作原理
理解 Kubernetes 中的 Service
理解 Service 在 Kubernetes 网络中的工作原理
理解 Kubernetes 中的服务发现
掌握 Kubernetes 中外部访问的几种方式

Chapter 9:Ingress 及负载均衡
理解 Ingress 和 Ingress controller 的工作原理
掌握如何创建 Ingress 规则
掌握如何部署 Ingress controller

Chapter 10:DaemonSets,StatefulSets,Jobs,HPA,RBAC
了解 DaemonSet 资源和功能
了解 StatefulSet 资源和功能
了解 Jobs 资源和功能
了解 HPA 资源和功能
了解 RBAC 资源和功能

Chapter 11:Kubernetes 调度
理解 Pod 调度的相关概念
深度理解 Kubernetes 调度策略和算法
深度理解调度时的 Node 亲和性
深度理解调度时的 Pod 亲和性和反亲和性
深度理解污点和容忍对调度的影响
深度理解强制调度 Pod 的方法

Chapter 12:日志、监控、Troubleshooting
理解 Kubernetes 集群的日志方案
理解 Kubernetes 集群的监控方案
了解相关开源项目:Heapster,Fluentd,Prometheus 等
掌握常用的集群,Pod,Service 等故障排查和运维手段

Chapter 13:自定义资源 CRD
理解和掌握 Kubernetes 中如何自定义 API 资源
可以通过 kubectl 管理 API 资源
了解用于自定义资源的 Controller 及相关使用示例
了解 TPR 和 CRD

Chapter 14:Kubernetes Federation
了解 Kubernetes 中 Federation 的作用和原理
了解 Federation 的创建过程
了解 Federation 支持的 API 资源
了解集群间平衡 Pod 副本的方法

Chapter 15:应用编排 Helm,Chart
了解 Kubernetes 中如何进行应用编排
了解 Helm 的作用和工作原理
了解 Tiller 的作用和工作原理
了解 Charts 的作用和工作原理

Chapter 16:Kubernetes 安全
了解 Kubernetes 中 API 访问过程
了解 Kubernetes 中的 Authentication
了解 Kubernetes 中的 Authorization
了解 ABAC 和 RBAC 两种授权方式
了解 Kubernetes 中的 Admission
了解 Pod 和容器的操作权限安全策略
了解 Network Policy 的作用和资源配置方法