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