[TOC]

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

1.etcd服务

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

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网络也可以添加认证

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 网络给删除。

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中加入如下命令,以添加网络管理配置。

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学习课程,用来参考做学习:

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 的作用和资源配置方法