搭建Kubernetes时容易遇到的问题

参考链接:https://www.cnblogs.com/chiwg/p/5009516.html

因为网上关于如何搭建kubernetes的文章很多(刘天斯大神的很不错 链接:http://blog.liuts.com/post/247/)

所以具体过程我就不再叙述了,我只说我在搭建过程中遇到的问题。

我的集群主机系统版本为:centos7

我使用的etcd版本为:etcd-0.4.6-7.el7.centos.x86_64.rpm

kubernetes版本为:kubernetes-1.1.0-0.4.git2bfa9a1.el7.x86_64.rpm

配置参考文档为:https://github.com/kubernetes/kubernetes/blob/a676b118b9ecb5f1f1797531ba6f555e82d58201/docs/getting-started-guides/centos/centos_manual_config.md

1.错误提示信息

  Unable to listen for secure (open /var/run/kubernetes/apiserver.crt: no such file or directory)

  解决方案:

     创建 目录/var/run/kubernetes/

  # vim /usr/lib/systemd/system/kube-apiserver.service

  Service下增加如下内容:

  [Service]
  PermissionsStartOnly=true
  ExecStartPre=/usr/bin/chown -R kube:kube /var/run/kubernetes/
 
2.官方的配置文档以及gitHub上的kubernetes的配置文档中有一些参数不正确,还请各位仔细观察,下面列出错误的参数:
  错误参数均为中间带"-的",正确的应该为"_"
  误:KUBELET_PORT="--kubelet-port=10250"
  正:KUBELET_PORT="--kubelet_port=10250"
  误:KUBE_ETCD_SERVERS="--etcd-servers=http://centos-master:4001"
  正:KUBE_ETCD_SERVERS="--etcd_servers=http://centos-master:4001"
  误:KUBE_ALLOW_PRIV="--allow-privileged=false"
  正:KUBE_ALLOW_PRIV="--allow_privileged=false"
  误:KUBELET_HOSTNAME="--hostname-override=centos-minion172"
  正:KUBELET_HOSTNAME="--hostname_override=centos-minion172"
  误:KUBELET_API_SERVER="--api-servers=http://centos-master:8080"
  正:KUBELET_API_SERVER="--api_servers=http://centos-master:8080"
3.如果执行kubectl get nodes时得到的集群主机状态为NotReady
  请检查防火墙firewalld.service  iptables.service
  systemctl stop iptables.service
  systemctl disable iptables.service
  systemctl stop firewalld.service
  systemctl disable firewalld.service
4.如果执行kubectl get pods -o wide时得到的结果中,READY始终为0/1,而RESTARTS数量却为>1的情况
  那么是由于你创建POD或者replication的时候使用的镜像不正确
  镜像的根目录下一定要有一个run.sh文件,这样启动的容器才会是一直running的状态
5.集群node主机上的kubelet配置文件最后一项请修改为:

  KUBELET_ARGS="--pod-infra-container-image={私有仓库地址}/pause:0.8.0"

  提前在本地私有仓库准备好此镜像或者指定可以下载到的镜像地址

6.起来master主机上的服务时,遇到类似如下错误:

  No cloud provider specified.

  Failed to start service controller: ServiceController should not be run without a cloudprovider.

  此类错误,目前未发现会影响具体哪些功能,待后面发现再进行解决

 

 

欢迎各位指正,遇到新的情况,我会继续补充。

下面贴出我的配置文件,供各位参考

config  (master和node一样)

 搭建Kubernetes时容易遇到的问题_第1张图片

apiserver   (只配置master)

搭建Kubernetes时容易遇到的问题_第2张图片

kubelet (只配置node)

搭建Kubernetes时容易遇到的问题_第3张图片

下面是我创建的RC和SERVICE

搭建Kubernetes时容易遇到的问题_第4张图片

顺利贴出来我的两个yaml文件 供参考

搭建Kubernetes时容易遇到的问题_第5张图片

搭建Kubernetes时容易遇到的问题_第6张图片


部署kube-apiserver

参考链接:https://blog.csdn.net/csmans/article/details/80336181

1. 创建kube-apiserver证书

1)创建kube-apiserver证书签名请求

复制代码
# api-server启用双向TLS认证
[root@kubenode1 ~]# mkdir -p /etc/kubernetes/apiserver
[root@kubenode1 ~]# cd /etc/kubernetes/apiserver/
[root@kubenode1 apiserver]# touch apiserver-csr.json

# hosts字段不为空时,指定授权使用该证书的ip与域名列表;
# 加入集群个节点ip,1次生成证书分发即可;
# 前端ha节点也需要与apiserver通信;
# 同时指定集群内部多个域名与kube-apiserver注册的名为kubernetes的服务ip(Service Cluster IP),一般是--service-cluster-ip-range 选项值指定的网段的第一个IP
[root@kubenode1 apiserver]# vim apiserver-csr.json
{
    "CN": "kubernetes",
    "hosts": [
      "127.0.0.1",
      "172.30.200.10",
      "172.30.200.11",
      "172.30.200.12",
      "172.30.200.21",
      "172.30.200.22",
      "172.30.200.23",
      "169.169.0.1",
      "kubernetes",
      "kubernetes.default",
      "kubernetes.default.svc",
      "kubernetes.default.svc.cluster",
      "kubernetes.default.svc.cluster.local"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "ChengDu",
            "L": "ChengDu",
            "O": "k8s",
            "OU": "cloudteam"
        }
    ]
}
复制代码

2)生成kube-apiserver证书与私钥

[root@kubenode1 apiserver]# 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 apiserver-csr.json | cfssljson -bare apiserver

# 分发apiserver.pem,apiserver-key.pem
[root@kubenode1 apiserver]# scp apiserver.pem apiserver-key.pem [email protected]:/etc/kubernetes/apiserver/
[root@kubenode1 apiserver]# scp apiserver.pem apiserver-key.pem [email protected]:/etc/kubernetes/apiserver/

2. 配置kube-apiserver的systemd unit文件

相关可执行文件在部署kubectl时已部署完成。

1)创建kube-apiserver使用的客户端token文件

kubelet 启动时向 kube-apiserver发送注册信息,在双向的TLS加密通信环境中需要认证,手工为kubelet生成证书/私钥在node节点较少且数量固定时可行,采用TLS Bootstrapping 机制,可使大量的node节点自动完成向kube-apiserver的注册请求。

原理:kubelet 首次启动时向 kube-apiserver 发送 TLS Bootstrapping 请求,kube-apiserver 验证 kubelet 请求中的 token 是否与它配置的 token.csv 一致,如果一致则自动为 kubelet生成证书和秘钥。

复制代码
[root@kubenode1 ~]# mkdir -p /etc/kubernetes/bootstrap
[root@kubenode1 ~]# cd /etc/kubernetes/bootstrap/
[root@kubenode1 bootstrap]# cat > token.csv << EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF

# 分发
[root@kubenode1 ~]# scp /etc/kubernetes/bootstrap/token.csv [email protected]:/etc/kubernetes/bootstrap/
[root@kubenode1 ~]# scp /etc/kubernetes/bootstrap/token.csv [email protected]:/etc/kubernetes/bootstrap/
复制代码

2)配置kube-apiserver的systemd unit文件

复制代码
[root@kubenode1 ~]# touch /usr/lib/systemd/system/kube-apiserver.service
[root@kubenode1 ~]# vim /usr/lib/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target

[Service]
User=root
EnvironmentFile=/usr/local/kubernetes/kube-apiserver.conf
ExecStart=/usr/local/kubernetes/bin/kube-apiserver $KUBE_API_ARGS
Restart=on-failure
RestartSec=5
Type=notify
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
# 启动参数文件; # --admission-control:kuberneres集群的准入控制机制,各控制模块以插件的形式依次生效,集群时必须包含ServiceAccount; # --bind-address:不能为 127.0.0.1;在本地址的6443端口开启https服务,默认值0.0.0.0; # --insecure-port=0:禁用不安全的http服务,默认开启,端口8080,设置为0禁用; --secure-port=6443:https安全端口,默认即6443,0表示禁用; # --authorization-mode:在安全端口使用 RBAC 授权模式,未通过授权的请求拒绝; # --service-cluster-ip-range:指定 Service Cluster IP 地址段,该地址段外部路由不可达; # --service-node-port-range:指定 NodePort 的端口范围; # --storage-backend:持久化存储类型,v1.6版本后默认即etcd3; # --enable-swagger-ui:设置为true时,启用swagger-ui网页,可通过apiserver的usl/swagger-ui访问,默认为false; # --allow-privileged:设置为true时,kubernetes允许在Pod中运行拥有系统特权的容器应用; # --audit-log-*:审计日志相关; # --event-ttl:apiserver中各时间保留时间,默认即1h,通常用于审计与追踪; # --logtostderr:默认为true,输出到stderr,不输出到日志; # --log-dir:日志目录; # --v:日志级别 [root@kubenode1 ~]# touch /usr/local/kubernetes/kube-apiserver.conf [root@kubenode1 ~]# vim /usr/local/kubernetes/kube-apiserver.conf KUBE_API_ARGS="--admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota,NodeRestriction \ --advertise-address=172.30.200.21 \ --bind-address=172.30.200.21 \ --insecure-port=0 \ --authorization-mode=Node,RBAC \ --runtime-config=rbac.authorization.k8s.io/v1beta1 \ --kubelet-https=true \ --token-auth-file=/etc/kubernetes/bootstrap/token.csv \ --service-cluster-ip-range=169.169.0.0/16 \ --service-node-port-range=10000-60000 \ --tls-cert-file=/etc/kubernetes/apiserver/apiserver.pem \ --tls-private-key-file=/etc/kubernetes/apiserver/apiserver-key.pem \ --client-ca-file=/etc/kubernetes/ssl/ca.pem \ --service-account-key-file=/etc/kubernetes/ssl/ca-key.pem \ --etcd-cafile=/etc/kubernetes/ssl/ca.pem \ --etcd-certfile=/etc/kubernetes/apiserver/apiserver.pem \ --etcd-keyfile=/etc/kubernetes/apiserver/apiserver-key.pem \ --storage-backend=etcd3 \ --etcd-servers=https://172.30.200.21:2379,https://172.30.200.22:2379,https://172.30.200.23:2379 \ --enable-swagger-ui=true \ --allow-privileged=true \ --apiserver-count=3 \ --audit-log-maxage=30 \ --audit-log-maxbackup=3 \ --audit-log-maxsize=100 \ --audit-log-path=/var/lib/audit.log \ --event-ttl=1h \ --logtostderr=false \ --log-dir=/var/log/kubernetes/apiserver \ --v=2 1>>/var/log/kubernetes/apiserver/kube-apiserver.log 2>&1" # 创建日志目录 [root@kubenode1 ~]# mkdir -p /var/log/kubernetes/apiserver 
复制代码

3. 启动并验证

[root@kubenode1 ~]# systemctl daemon-reload
[root@kubenode1 ~]# systemctl enable kube-apiserver
[root@kubenode1 ~]# systemctl start kube-apiserver
[root@kubenode1 ~]# systemctl status kube-apiserver


转载:https://www.cnblogs.com/netonline/p/8710481.html


你可能感兴趣的:(搭建Kubernetes时容易遇到的问题)