kubernetes之安装与配置

本文为观看Kubernetes权威指南-第二版.pdf第二章的笔记。

简单的安装方式

最简单的安装方式, 仍需修改各组件的启动参数, 才能完成kubernetes集群的配置。

  1. 安装etcd和kubernetes。

    yum install -y etcd kubernetes
  2. 修改配置文件。

    # 将OPTIONS的内容设置为'--selinux-enabled=false --insecure-registry gcr.io'
    vim /etc/sysconfig/docker
    
    # 把--admission_control参数中的ServiceAccount删除
    vim /etc/kubernetes/apiserver
  3. 按顺序启动所有服务。

    systemctl start etcd
    systemctl start docker
    systemctl start kube-apiserver
    systemctl start kube-controller-manager
    systemctl start kube-scheduler
    systemctl start kubelet
    systemctl start kube-proxy
  4. 至此单机版的kubernetes搭建完成。

Q&A

  • apiserver端口占用?

    默认为8080。

    修改/etc/kubernetes/apiserver里的配置KUBE_API_PORT

    同时修改kubectl的映射alias kubectl='kubectl -s http://localhost:8081'

通过二进制文件和手动配置启动参数安装

下载地址为kubernetes-v1.3.0, 解压后, server子目录中kubernetes-server-linux-amd64.tar.gz包含了kubernetes需要运行的全部服务程序文件。

Master

etcd
  • 下载etcd, 使用版本为3.0.0

    curl -L https://github.com/coreos/etcd/releases/download/v3.0.0/etcd-v3.0.0-linux-amd64.tar.gz -o etcd-v3.0.0-linux-amd64.tar.gz
  • etcdetcdctl复制到/usr/bin目录下。

  • 设置systemd服务文件/usr/lib/systemd/system/etcd.service

    WorkingDirectory为etcd数据保存的目录, 需要在启动etcd服务之前进行创建。

    [Unit]
    Description=Etcd Server
    After=network.target
    
    [Service]
    Type=simple
    WorkingDirectory=/var/lib/etcd/
    EnvironmentFile=-/etc/etcd/etcd.conf
    ExecStart=/usr/bin/etcd
    
    [Install]
    WantedBy=multi-user.target
  • 通过systemctl start命令启动etcd服务。

    systemctl daemon-reload
    systemctl enable etcd.service
    systemctl start etcd.service
  • 通过执行etcdctl cluster-health, 可以验证etcd是否正确启动。

kube-apiserver
  • 拷贝kube-apiserver复制到/usr/bin目录。

  • 设置systemd服务文件/usr/lib/systemd/system/kube-apiserver.service

    [Unit]
    Description=Kubernetes API Server
    Documentation=https://github.com/kubernetes/kubernetes
    After=etcd.service
    Wants=etcd.service
    
    [Service]
    EnvironmentFile=/etc/kubernetes/apiserver
    ExecStart=/usr/bin/kube-apiserver $KUBE_API_ARGS
    Restart=on-failure
    Type=notify
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target
  • 在配置文件/etc/kubernetes/apiserver中配置kube-apiserver的启动参数。

    KUBE_API_ARGS="--etcd_servers=http://127.0.0.1:2379 
                   --insecure-bind-address=0.0.0.0
                   --insecure-port=8081 
                   --service-cluster-ip-range=169.169.0.0/16
                   --service-node-port-range=1-65535
    --admission_control=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota
                   --logtostderr=false 
                   --log-dir=/var/log/kubernetes 
                   --v=2" 
    • –etcd_servers: etcd服务的url。
    • –service-cluster-ip-range: kubernetes集群中Service虚拟IP地址段范围, 以CIDR格式表示, 该IP范围不能与物理机的真实IP段有重合。
    • –service-node-port-range: kubernetes集群中Service可映射的物理机端口号范围, 默认为30000~32767
    • –admission_control: kubernetes集群的准入控制设置, 各控制模块以插件的形式依次生效。
    • –logtostderr: 设置为false表示将日志写入文件, 不写入stderr。
    • –log-dir: 日志目录。
    • –v: 日志级别。
kube-controller-manager
  • 拷贝kube-controller-manager复制到/usr/bin目录。

  • 设置systemd服务文件/usr/lib/systemd/system/kube-controller-manager.service

    [Unit]
    Description=Kubernetes Controller Manager
    Documentation=https://github.com/kubernetes/kubernetes
    After=kube-apiserver.service
    Requires=kube-apiserver.service
    
    [Service]
    EnvironmentFile=/etc/kubernetes/controller-manager
    ExecStart=/usr/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_ARGS
    Restart=on-failure
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target
  • 在配置文件/etc/kubernetes/controller-manager中配置kube-controller-manager的启动参数。

    KUBE_CONTROLLER_MANAGER_ARGS="--master=http://127.0.0.1:8081 --logtostderr=false --log-dir=/var/log/kubernetes --v=2"
kube-scheduler
  • 拷贝kube-scheduler复制到/usr/bin目录。

  • 设置systemd服务文件/usr/lib/systemd/system/kube-scheduler.service

    [Unit]
    Description=Kubernetes Scheduler
    Documentation=https://github.com/kubernetes/kubernetes
    After=kube-apiserver.service
    Requires=kube-apiserver.service
    
    [Service]
    EnvironmentFile=/etc/kubernetes/scheduler
    ExecStart=/usr/bin/kube-scheduler $KUBE_SCHEDULER_ARGS
    Restart=on-failure
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target
  • 在配置文件/etc/kubernetes/scheduler中配置kube-scheduler的启动参数。

    KUBE_SCHEDULER_ARGS="--master=http://127.0.0.1:8081 --logtostderr=false --log-dir=/var/log/kubernetes --v=2"
start
  • 通过systemctl start命令启动以上三个服务。

    systemctl daemon-reload
    systemctl enable <service_name>
    systemctl start <service_name>
  • 通过systemctl status <service_name>来验证服务的启动状态, running表示启动成功。

  • kubectl复制到/usr/bin目录。

  • 到此, Master上所需的服务就全部启动完成了。

Node

在Node节点上需要预先安装好Docker Daemon并且正常启动。

kubelet

kubelet服务依赖于Docker服务。

  • 拷贝kubelet复制到/usr/bin目录。

  • 设置systemd服务文件/usr/lib/systemd/system/kubelet.service

    [Unit]
    Description=Kubernetes Kubelet Server
    Documentation=https://github.com/kubernetes/kubernetes
    After=docker.service
    Requires=docker.service
    
    [Service]
    WorkingDirectory=/var/lib/kubelet
    EnvironmentFile=/etc/kubernetes/kubelet
    ExecStart=/usr/bin/kubelet $KUBELET_ARGS
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
  • 在配置文件/var/lib/kubelet中配置kubelet的启动参数。

    KUBELET_ARGS="--api-servers=http://127.0.0.1:8081 --hostname-override=127.0.0.1 --logtostderr=false --log-dir=/var/log/kubernetes --v=2"
kube-proxy

kube-proxy服务依赖于network服务。

  • 拷贝kube-proxy复制到/usr/bin目录。

  • 设置systemd服务文件/usr/lib/systemd/system/kube-proxy.service

    [Unit]
    Description=Kubernetes Kube-Proxy Server
    Documentation=https://github.com/kubernetes/kubernetes
    After=network.target
    Requires=network.service
    
    [Service]
    EnvironmentFile=/etc/kubernetes/proxy
    ExecStart=/usr/bin/kube-proxy $KUBE_PROXY_ARGS
    Restart=on-failure
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target
  • 在配置文件/etc/kubernetes/proxy中配置kube-proxy的启动参数。

    KUBE_PROXY_ARGS="--master=http://127.0.0.1:8081 --logtostderr=false --log-dir=/var/log/kubernetes --v=2"
LAST

参考start启动kubelet和kube-proxy服务。

因端口使用的不是默认的8080, 执行alias kubectl='kubectl -s http://localhost:8081'

因为kubelet默认采用想Master自动注册本Node的机制, 可直接查看Node的状态, 状态为Ready表示Node已经成功注册并且状态为可用。

kubectl get nodes

Q&A

  1. 出现问题, 非预期表现。

    使用journalctl -xe查看详细报错信息, 针对性解决。

TODO

  • 仍需关注的点包括安全设置, 其支持基于CA签名的数字证书认证方式基于HTTP BASE或TOKEN的简单认证方式

  • 在多个Node组成的Kubernetes集群内, 跨主机的容器间网络互通式Kubernetes集群能够正常工作的前提条件。Kubernetes本身并不会对跨主机网络进行设置, 这需要额外的工具来实现, 开源工具包括flannel、Open vSwitch、Weave、Calico等都能够实现跨主机的容器间网络互通。

    也可以通过在每个Node上添加其他Node上的docker0的静态路由规则, 将不同物理机的docker0网桥互联互通。


文章作者: the next page
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 the next page !
评论
 上一篇
kubernetes之kubectl kubernetes之kubectl
命令行语法kubectl [command] [TYPE] [NAME] [flags] command: 子命令, 用于操作kubernetes集群资源对象的命令, 如create、delete、describe、get、apply等。
2019-12-13 the next page
下一篇 
kubernetes之初入门 kubernetes之初入门
本文为观看Kubernetes权威指南-第二版.pdf第一章的笔记, 主要是k8s的核心概念。 概要给pod(其中运行了服务进程容器)贴上label(标签), 然后给相应的Service定义Label Selector(标签选择器), 这样
2019-12-04 the next page
  目录