前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ubuntu 16.04部署kubernetes集群【详细教程】

ubuntu 16.04部署kubernetes集群【详细教程】

作者头像
学一学大数据
发布2018-12-27 10:45:22
2.8K0
发布2018-12-27 10:45:22
举报
文章被收录于专栏:学一学大数据

作为一名新时代的运维工程师,不掌握k8s这样开阔时代的工具怎能成为一名好运维呢?最近两周在折腾k8s集群,发现很是不容易。各种概念,各种插件。这里把安装过程和遇到的坑分享给大家,亲测这个教程搭建成功。k8s各种概念建议先理解概念后再上手搭建:

k8s 中文指南 实践手册

https://www.bookstack.cn/read/kubernetes-handbook/concepts-deployment.md

1.1 部署Kubernetes集群Master

服务器资源规划和配置

服务器

IP

配置

备注

master

192.168.1.72

系统:ubuntu 16.04 CPU:1 内存:1G

k8s集群master

node01

192.168.1.73

系统:ubuntu 16.04 CPU:1 内存:1G

k8s集群node01

node02

192.168.1.74

系统:ubuntu 16.04 CPU:1 内存:1G

k8s集群node02

1.1.1 安装Docker

代码语言:javascript
复制
# 关闭防火墙ufw disable && ufw status# 执行脚本安装dockercurl -s  https://raw.githubusercontent.com/jy1779/docker/master/install/aliyun_docker_install.sh | bash# 修改docker.server参数LINE=$(grep -n ExecStart /lib/systemd/system/docker.service|awk -F : '{print $1}')
EXECSTARTPOST='ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT'
sed "$LINE a$EXECSTARTPOST" -i /lib/systemd/system/docker.service# 重新加载docker.server及重启docker服务systemctl daemon-reload && service docker restart

1.1.2 生成配置文件及根证书

代码语言:javascript
复制
# 添加内核参数# 参数说明:# Controls IP packet forwardingnet.ipv4.ip_forward = 1# Enable netfilter on bridges.net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

cat <<EOF > /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF# 使内核参数生效sysctl -p /etc/sysctl.d/k8s.conf# 如提示以下报错,则执行:modprobe br_netfiltersysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory# 添加hosts文件echo -e "192.168.1.72 master\n192.168.1.73 node01\n192.168.1.74 node02" >> /etc/hosts# 获取k8s二进制文件及配置文件# kubernetes.git 并非官网的文件,是自定义安装k8s集群所需的文件root@master:~# git clone https://code.aliyun.com/jy1779/kubernetes.git# 解压k8s二进制文件,并添加到系统环境变量root@master:~# tar xf ./kubernetes/kubernetes-bins.tar.gz -C /usr/local/sbin/ && rm -f ./kubernetes/kubernetes-bins.tar.gz
root@master:~# echo 'export PATH=$PATH:/usr/local/sbin/kubernetes-bins' >> /etc/profile && source /etc/profile# 检测环境变量root@master:~# which kubectl 
/usr/local/sbin/kubernetes-bins/kubectl# 生成配置文件cd /root/kubernetes/kubernetes-starter/#修改配置文件vim config.properties#kubernetes二进制文件目录,eg: /home/michael/binBIN_PATH=/usr/local/sbin/kubernetes-bins#当前节点ip, eg: 192.168.1.102NODE_IP=192.168.1.72#etcd服务集群列表, eg: http://192.168.1.102:2379#如果已有etcd集群可以填写现有的。没有的话填写:http://${MASTER_IP}:2379 (MASTER_IP自行替换成自己的主节点ip)ETCD_ENDPOINTS=https://192.168.1.72:2379,https://192.168.1.73:2379,https://192.168.1.74:2379#kubernetes主节点ip地址, eg: 192.168.1.102MASTER_IP=192.168.1.72
root@master:~/kubernetes/kubernetes-starter# ./gen-config.sh with-ca
====替换变量列表====
BIN_PATH=/usr/local/sbin/kubernetes-bins
NODE_IP=192.168.1.72
ETCD_ENDPOINTS=https://192.168.1.72:2379,https://192.168.1.73:2379,https://192.168.1.74:2379
MASTER_IP=192.168.1.72
====================
====替换配置文件====
all-node/kube-calico.service
ca/admin/admin-csr.json
ca/ca-config.json
ca/ca-csr.json
ca/calico/calico-csr.json
ca/etcd/etcd-csr.json
ca/kube-proxy/kube-proxy-csr.json
ca/kubernetes/kubernetes-csr.json
master-node/etcd.service
master-node/kube-apiserver.service
master-node/kube-controller-manager.service
master-node/kube-scheduler.service
services/kube-dashboard.yaml
services/kube-dns.yaml
worker-node/10-calico.conf
worker-node/kubelet.service
worker-node/kube-proxy.service
=================配置生成成功,位置: /root/kubernetes/kubernetes-starter/target# 安装cfsslwget -q --show-progress --https-only --timestamping \
  https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 \
  https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 #修改为可执行权限chmod +x cfssl_linux-amd64 cfssljson_linux-amd64#移动到bin目录mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson#验证cfssl version# 生成根证书# 创建目录存放ca证书mkdir -p /etc/kubernetes/ca# 提示:ca-config.json、ca-csr.json事先已经准备好,可修改,也可以自己生成# 复制ca文件cp ~/kubernetes/kubernetes-starter/target/ca/ca-config.json /etc/kubernetes/ca
cp ~/kubernetes/kubernetes-starter/target/ca/ca-csr.json /etc/kubernetes/ca# 生成证书和密钥cd /etc/kubernetes/ca
cfssl gencert -initca ca-csr.json | cfssljson -bare ca# 查看证书和密钥root@master:/etc/kubernetes/ca# ls
ca-config.json  ca.csr  ca-csr.json  ca-key.pem  ca.pem

1.1.3 部署Etcd

etcd节点需要提供给其他服务访问,就要验证其他服务的身份,所以需要一个标识自己监听服务的server证书,当有多个etcd节点的时候也需要client证书与etcd集群其他节点交互,当然也可以client和server使用同一个证书因为它们本质上没有区别。

代码语言:javascript
复制
#创建存放etcd证书的目录mkdir -p /etc/kubernetes/ca/etcd#复制etcd证书配置cp ~/kubernetes/kubernetes-starter/target/ca/etcd/etcd-csr.json /etc/kubernetes/ca/etcd/
cd /etc/kubernetes/ca/etcd/#使用根证书(ca.pem)签发etcd证书cfssl gencert \
        -ca=/etc/kubernetes/ca/ca.pem \
        -ca-key=/etc/kubernetes/ca/ca-key.pem \
        -config=/etc/kubernetes/ca/ca-config.json \
        -profile=kubernetes etcd-csr.json | cfssljson -bare etcd#跟之前类似生成三个文件etcd.csr是个中间证书请求文件,我们最终要的是etcd-key.pem和etcd.pemls
etcd.csr  etcd-csr.json  etcd-key.pem  etcd.pem# 启动etcd服务#创建工作目录(保存数据的地方)mkdir -p /var/lib/etcd#把etcd服务配置文件copy到系统服务目录cp ~/kubernetes/kubernetes-starter/target/master-node/etcd.service /lib/systemd/system/# 创建etcd服务systemctl enable etcd.service#启动etcd服务service etcd start# 查看服务日志,看是否有错误信息,确保服务正常journalctl -f -u etcd.service#测试etcd服务是否正常ETCDCTL_API=3 etcdctl \
  --endpoints=https://192.168.1.72:2379  \
  --cacert=/etc/kubernetes/ca/ca.pem \
  --cert=/etc/kubernetes/ca/etcd/etcd.pem \
  --key=/etc/kubernetes/ca/etcd/etcd-key.pem \
  endpoint health#显示以下则为部署成功。https://192.168.1.72:2379 is healthy: successfully committed proposal: took = 10.408412ms

1.1.4 部署APIServer

代码语言:javascript
复制
# 创建存放api证书目录mkdir -p /etc/kubernetes/ca/kubernetes#复制apiserver证书配置cp ~/kubernetes/kubernetes-starter/target/ca/kubernetes/kubernetes-csr.json /etc/kubernetes/ca/kubernetes/#使用根证书(ca.pem)签发kubernetes证书cd /etc/kubernetes/ca/kubernetes/
cfssl gencert \
        -ca=/etc/kubernetes/ca/ca.pem \
        -ca-key=/etc/kubernetes/ca/ca-key.pem \
        -config=/etc/kubernetes/ca/ca-config.json \
        -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes#跟之前类似生成三个文件kubernetes.csr是个中间证书请求文件,我们最终要的是kubernetes-key.pem和kubernetes.pemls
kubernetes.csr  kubernetes-csr.json  kubernetes-key.pem  kubernetes.pem#生成token认证文件#生成随机tokenhead -c 16 /dev/urandom | od -An -t x | tr -d ' '

root@master:/etc/kubernetes/ca/kubernetes# head -c 16 /dev/urandom | od -An -t x | tr -d ' '
97e8c07dce2b2bab69cfd3162d5383c9# 写入token.csv文件echo "97e8c07dce2b2bab69cfd3162d5383c9,kubelet-bootstrap,10001,"system:kubelet-bootstrap"" > /etc/kubernetes/ca/kubernetes/token.csv# 把apiservice服务配置文件copy到系统服务目录cp ~/kubernetes/kubernetes-starter/target/master-node/kube-apiserver.service /lib/systemd/system/# 创建kube-apiserver服务systemctl enable kube-apiserver.service# 启动kube-apiserver服务service kube-apiserver start# 查看kube-apiserver日志journalctl -f -u kube-apiserver

1.1.5 部署Controller-manager

controller-manager一般与api-server在同一台机器上,所以可以使用非安全端口与api-server通讯,不需要生成证书和私钥。

代码语言:javascript
复制
# 把kube-controller-manager.service 服务配置文件copy到系统服务目录cp ~/kubernetes/kubernetes-starter/target/master-node/kube-controller-manager.service /lib/systemd/system/# 创建kube-controller-manager.service 服务systemctl enable kube-controller-manager.service# 启动kube-controller-manager.service 服务service kube-controller-manager start# 查看kube-controller-manager.service 日志journalctl -f -u kube-controller-manager

1.1.6 部署Scheduler

Scheduler一般与api-server在同一台机器上,所以可以使用非安全端口与api-server通讯,不需要生成证书和私钥。

代码语言:javascript
复制
# 把scheduler 服务配置文件copy到系统服务目录cp ~/kubernetes/kubernetes-starter/target/master-node/kube-scheduler.service /lib/systemd/system/# 创建kube-scheduler.service 服务systemctl enable kube-scheduler.service# 启动kube-scheduler.service 服务service kube-scheduler start# 查看kube-scheduler.service 日志journalctl -f -u kube-scheduler

1.1.7 配置Kubectl管理

代码语言:javascript
复制
# 创建存放kubectl证书目录mkdir -p /etc/kubernetes/ca/admin# 准备admin证书配置 - kubectl只需客户端证书,因此证书请求中 hosts 字段可以为空# 复制kubectl证书配置cp ~/kubernetes/kubernetes-starter/target/ca/admin/admin-csr.json /etc/kubernetes/ca/admin/# 使用根证书(ca.pem)签发admin证书cd /etc/kubernetes/ca/admin/
cfssl gencert \
        -ca=/etc/kubernetes/ca/ca.pem \
        -ca-key=/etc/kubernetes/ca/ca-key.pem \
        -config=/etc/kubernetes/ca/ca-config.json \
        -profile=kubernetes admin-csr.json | cfssljson -bare admin# 我们最终要的是admin-key.pem和admin.pemls
admin.csr  admin-csr.json  admin-key.pem  admin.pem# 配置kubectl文件# 指定apiserver的地址和证书位置kubectl config set-cluster kubernetes \
        --certificate-authority=/etc/kubernetes/ca/ca.pem \
        --embed-certs=true \
        --server=https://192.168.1.72:6443# 设置客户端认证参数,指定admin证书和秘钥kubectl config set-credentials admin \
        --client-certificate=/etc/kubernetes/ca/admin/admin.pem \
        --embed-certs=true \
        --client-key=/etc/kubernetes/ca/admin/admin-key.pem# 关联用户和集群kubectl config set-context kubernetes \
        --cluster=kubernetes --user=admin# 设置当前上下文kubectl config use-context kubernetes# 设置结果就是一个配置文件,可以看看内容cat ~/.kube/config# 验证master节点,etcd-1和etcd-2还没有部署root@master:/etc/kubernetes/ca/admin# kubectl get componentstatus
NAME                 STATUS      MESSAGE                                                                                            ERROR
etcd-2               Unhealthy   Get https://192.168.1.74:2379/health: dial tcp 192.168.1.74:2379: getsockopt: connection refused   
scheduler            Healthy     ok                                                                                                 
etcd-1               Unhealthy   Get https://192.168.1.73:2379/health: dial tcp 192.168.1.73:2379: getsockopt: connection refused   
controller-manager   Healthy     ok                                                                                                 
etcd-0               Healthy     {"health": "true"} 
# 创建kubelet-bootstrap绑定kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap

1.1.8 部署Calico网络

Calico实现了CNI接口,是kubernetes网络方案的一种选择,它一个纯三层的数据中心网络方案(不需要Overlay),并且与OpenStack、Kubernetes、AWS、GCE等IaaS和容器平台都有良好的集成。 Calico在每一个计算节点利用Linux Kernel实现了一个高效的vRouter来负责数据转发,而每个vRouter通过BGP协议负责把自己上运行的workload的路由信息像整个Calico网络内传播——小规模部署可以直接互联,大规模下可通过指定的BGP route reflector来完成。 这样保证最终所有的workload之间的数据流量都是通过IP路由的方式完成互联的。

代码语言:javascript
复制
# calico证书用在四个地方:# calico/node: 这个docker 容器运行时访问 etcd 使用证书# cni 配置文件中 cni 插件: 需要访问 etcd 使用证书# calicoctl: 操作集群网络时访问 etcd 使用证书# calico/kube-controllers: 同步集群网络策略时访问 etcd 使用证书#创建存放calico证书mkdir -p /etc/kubernetes/ca/calico#准备calico证书配置 - calico只需客户端证书,因此证书请求中 hosts 字段可以为空cp ~/kubernetes/kubernetes-starter/target/ca/calico/calico-csr.json /etc/kubernetes/ca/calico/
cd /etc/kubernetes/ca/calico/
cfssl gencert \
        -ca=/etc/kubernetes/ca/ca.pem \
        -ca-key=/etc/kubernetes/ca/ca-key.pem \
        -config=/etc/kubernetes/ca/ca-config.json \
        -profile=kubernetes calico-csr.json | cfssljson -bare calico#我们最终要的是calico-key.pem和calico.pemls 
calico.csr  calico-csr.json  calico-key.pem  calico.pem#启动kube-calico.service 服务cp ~/kubernetes/kubernetes-starter/target/all-node/kube-calico.service /lib/systemd/system/
systemctl enable kube-calico.service
service kube-calico start
journalctl -f -u kube-calico#查看节点情况calicoctl node status

至此master部署完成,node的部署再下篇文章中讲解。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 学一学大数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.1 部署Kubernetes集群Master
    • 1.1.1 安装Docker
      • 1.1.2 生成配置文件及根证书
        • 1.1.3 部署Etcd
          • 1.1.4 部署APIServer
            • 1.1.5 部署Controller-manager
              • 1.1.6 部署Scheduler
                • 1.1.7 配置Kubectl管理
                相关产品与服务
                容器服务
                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档