目前Kubernetes为Ubuntu提供的kube-up脚本,不支持15.10以及16.04这两个使用systemd作为init系统的版本。

这里详细介绍一下如何以非Docker方式在Ubuntu16.04集群上手动安装部署Kubernetes的过程。

环境信息

组件 版本
etcd 2.3.1
Flannel 0.5.5
kubernetes 1.5.1

主机信息

主机 IP OS
k8s-master 172.12.24.36 ubuntu 16.04
k8s-node01 172.12.24.37 ubuntu 16.04
k8s-node02 172.12.24.38 ubuntu 16.04

安装docker

sudo apt-get install docker.io

安装Go

sudo apt-get install golang-go

部署etcd集群

我们将在3台机器上安装etcd集群

1.在部署机器上下载etcd

ETCD_VERSION=${ETCD_VERSION:-"2.3.1"}

ETCD="etcd-v${ETCD_VERSION}-Linux-amd64"

curl -L   https://github.com/coreos/etcd/releases/download/v${ETCD_VERSION}/${ETCD}.tar.gz -o etcd.tar.gz

2.解压etcd到tmp目录

tar xzf etcd.tar.gz -C /tmp

3.进入解压目录

cd /tmp/etcd-v${ETCD_VERSION}-linux-amd64

4.创建etcd集群

for h in k8s-master k8s-node01 k8s-node02; do ssh user@$h mkdir -p '$HOME/kube' && scp -r etcd* user@$h:~/kube; done
for h in k8s-master k8s-node01 k8s-node02; do ssh user@$h 'sudo mkdir -p
/opt/bin && sudo mv $HOME/kube/* /opt/bin && rm -rf
$home/kube/*'; done

注意:

1、这种创建集群的方式,每台集群的登录用户必须一致,如user@$h中的user指当前机器的登录用户。

2、sudo方式必须是免密码方式,否则执行当中报错。

修改为免密码方式:

sudo chmod   u+w  /etc/sudoers

sudo vim   /etc/sudoers

修改sudoers文件中的内容

%sudo    ALL=(ALL:ALL) ALL

修改为

%sudo    ALL=(ALL:ALL) NOPASSWD:ALL

3、该设置只需要在master节点执行,其他节点将会配置好

配置etcd服务

在每台主机上,分别创建/opt/config/etcd.conf和/lib/systemd/system/etcd.service文件,(注意修改红色粗体处的IP地址)

1.创建/opt/config/etcd.conf文件

sudo mkdir -p /var/lib/etcd/

sudo mkdir -p /opt/config/

sudo  cat <<EOF |  sudo tee /opt/config/etcd.conf
ETCD_DATA_DIR=/var/lib/etcd
ETCD_NAME=$(hostname)
ETCD_INITIAL_CLUSTER=k8s-master=http://172.12.24.36:2380,k8s-node01=http://172.12.24.37:2380,k8s-node02=http://172.12.24.38:2380
ETCD_INITIAL_CLUSTER_STATE=new
ETCD_LISTEN_PEER_URLS=http://172.12.24.36:2380
ETCD_INITIAL_ADVERTISE_PEER_URLS=http://172.12.24.36:2380
ETCD_ADVERTISE_CLIENT_URLS=http://172.12.24.36:2379
ETCD_LISTEN_CLIENT_URLS=http://172.12.24.36:2379
GOMAXPROCS=$(nproc)
EOF

2.创建 /lib/systemd/system/etcd.service文件

sudo  cat <<EOF |  sudo tee /lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
Documentation=https://github.com/coreos/etcd
After=network.target

[Service]
User=root
Type=simple
EnvironmentFile=-/opt/config/etcd.conf
ExecStart=/opt/bin/etcd
Restart=on-failure
RestartSec=10s
LimitNOFILE=40000

[Install]
WantedBy=multi-user.target
EOF

每台机器重新加载启动etcd服务

sudo systemctl daemon-reload

sudo systemctl enable etcd

sudo systemctl start etcd

下载Flannel

1.设定版本变量

FLANNEL_VERSION=${FLANNEL_VERSION:-"0.5.5"}

2.下载并重命名

curl -L 
https://github.com/coreos/flannel/releases/download/v${FLANNEL_VERSION}/flannel-${FLANNEL_VERSION}-linux-amd64.tar.gz    
flannel.tar.gz

3.解压到tmp目录

tar xzf  flannel.tar.gz -C /tmp

编译K8s

1.通过Git克隆kubernetes源码,注意需要克隆的分支

git clone -b  v1.5.1  https://github.com/kubernetes/kubernetes.git

2.进入源码目录

cd kubernetes

3.编译打包源码

make release-skip-tests

4.将编译打包完成的包解压到tmp目录

tar xzf _output/release-stage/full/kubernetes/server/kubernetes-server-linux-amd64.tar.gz  -C   /tmp

Note
除了linux/amd64,默认还会为其他平台做交叉编译。为了减少编译时间,可以修改hack/lib/golang.sh,把KUBE_SERVER_PLATFORMS,
KUBE_CLIENT_PLATFORMS和KUBE_TEST_PLATFORMS中除linux/amd64以外的其他平台注释掉。

部署K8s Master

1.切换到tmp目录

cd /tmp

2.将tmp中的文件远程复制到kubernetes相关文件目录中

scp kubernetes/server/bin/kube-apiserver 
kubernetes/server/bin/kube-controller-manager 
kubernetes/server/bin/kube-scheduler kubernetes/server/bin/kubelet
kubernetes/server/bin/kube-proxy user@172.12.24.36:~/kube

3.将tmp中的文件远程复制到flannel相关的文件目录中

scp flannel-${FLANNEL_VERSION}/flanneld user@172.12.24.36:~/kube

4.通过ssh方式连接服务器,移动文件目录
ssh -t user@172.12.24.36   'sudo mv ~/kube/* /opt/bin/'

注意:user为当前机器的登录用户

创建证书
在master主机上 ,运行如下命令创建证书

1.创建目录

sudo mkdir -p /srv/kubernetes/
2.切换目录
cd /srv/kubernetes
3.设置环境变量
export MASTER_IP=172.12.24.36

4.创建证书

sudo openssl genrsa -out ca.key 2048
sudo openssl req -x509 -new -nodes -key ca.key -subj "/CN=${MASTER_IP}" -days 10000 -out ca.crt
sudo openssl genrsa -out server.key 2048
sudo openssl req -new -key server.key -subj "/CN=${MASTER_IP}" -out server.csr
sudo openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 10000

配置kube-apiserver服务
我们使用如下的Service以及Flannel的网段:
SERVICE_CLUSTER_IP_RANGE=172.18.0.0/16
FLANNEL_NET=192.168.0.0/16
在master主机上,创建/lib/systemd/system/kube-apiserver.service文件,

sudo vim   /lib/systemd/system/kube-apiserver.service

内容如下
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
After=network.target

[Service]
User=root
ExecStart=/opt/bin/kube-apiserver   \
 --insecure-bind-address=0.0.0.0  \
 --insecure-port=8080  \
 --etcd-servers=http://172.12.24.36:2379, http://172.12.24.37:2379, http://172.12.24.38:2379 \
 --logtostderr=true  \
 --allow-privileged=false  \
 --service-cluster-ip-range=172.18.0.0/16  \
 --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,SecurityContextDeny,ResourceQuota  \
 --service-node-port-range=30000-32767   \
 --advertise-address=172.12.24.36   \
 --client-ca-file=/srv/kubernetes/ca.crt   \
 --tls-cert-file=/srv/kubernetes/server.crt   \
 --tls-private-key-file=/srv/kubernetes/server.key 
 
Restart=on-failure
Type=notify
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

配置kube-controller-manager服务
在master主机上,创建/lib/systemd/system/kube-controller-manager.service文件,

sudo vim /lib/systemd/system/kube-controller-manager.service

内容如下
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes

[Service]
User=root
ExecStart=/opt/bin/kube-controller-manager   \
  --master=127.0.0.1:8080  \
  --root-ca-file=/srv/kubernetes/ca.crt   \
  --service-account-private-key-file=/srv/kubernetes/server.key   \
  --logtostderr=true
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

配置kuber-scheduler服务
在master主机上,创建/lib/systemd/system/kube-scheduler.service文件,

sudo vim  /lib/systemd/system/kube-scheduler.service

内容如下
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes

[Service]
User=root
ExecStart=/opt/bin/kube-scheduler  \
  --logtostderr=true  \
  --master=127.0.0.1:8080
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

配置flanneld服务
在master主机上,创建/lib/systemd/system/flanneld.service文件,

sudo vim  /lib/systemd/system/flanneld.service

内容如下
[Unit]
Description=Flanneld
Documentation=https://github.com/coreos/flannel
After=network.target
Before=docker.service

[Service]
User=root
ExecStart=/opt/bin/flanneld  \
  --etcd-endpoints="http://172.12.24.36:2379,http://172.12.24.37:2379,http://172.12.24.38:2379"  \
  --iface=172.12.24.36  \
  --ip-masq
Restart=on-failure
Type=notify
LimitNOFILE=65536

启动服务
/opt/bin/etcdctl
--endpoints="http://172.12.24.54:2379,http://172.12.24.56:2379,http://172.12.24.60:2379"
mk /coreos.com/network/config '{"Network":"192.168.0.0/16", "Backend":
{"Type": "vxlan"}}'

sudo systemctl daemon-reload
sudo systemctl enable kube-apiserver
sudo systemctl enable kube-controller-manager
sudo systemctl enable kube-scheduler
sudo systemctl enable flanneld

sudo systemctl start kube-apiserver
sudo systemctl start kube-controller-manager
sudo systemctl start kube-scheduler
sudo systemctl start flanneld

修改Docker服务
source /run/flannel/subnet.env

sudo sed -i "s|^ExecStart=/usr/bin/dockerd -H
fd://$|ExecStart=/usr/bin/dockerd -H tcp://127.0.0.1:4243 -H
unix:///var/run/docker.sock --bip=${FLANNEL_SUBNET}
--mtu=${FLANNEL_MTU}|g" /lib/systemd/system/docker.service
rc=0
ip link show docker0 >/dev/null 2>&1 || rc="$?"
if [[ "$rc" -eq "0" ]]; then
ip link set dev docker0 down
ip link delete docker0
fi

sudo systemctl daemon-reload
sudo systemctl enable docker
sudo systemctl restart docker

部署K8s Node
复制程序文件

cd /tmp
for h in k8s-master k8s-node01 k8s-node02; do scp
kubernetes/server/bin/kubelet kubernetes/server/bin/kube-proxy
user@$h:~/kube; done
for h in k8s-master k8s-node01 k8s-node02; do scp flannel-${FLANNEL_VERSION}/flanneld user@$h:~/kube;done
for h in k8s-master k8s-node01 k8s-node02; do ssh -t user@$h 'sudo mkdir
-p /opt/bin && sudo mv ~/kube/* /opt/bin/'; done

配置Flanned以及修改Docker服务

参见Master部分相关步骤: 配置Flanneld服务,启动Flanneld服务,修改Docker服务。注意修改iface的地址

配置kubelet服务

/lib/systemd/system/kubelet.service,注意修改IP地址

[Unit]
Description=Kubernetes Kubelet
After=docker.service
Requires=docker.service

[Service]
ExecStart=/opt/bin/kubelet \
  --hostname-override=172.12.24.37  \
  --api-servers=http://172.12.24.36:8080  \
  --logtostderr=true
Restart=on-failure
KillMode=process

[Install]
WantedBy=multi-user.target

启动服务
sudo systemctl daemon-reload
sudo systemctl enable kubelet
sudo systemctl start kubelet

配置kube-proxy服务
/lib/systemd/system/kube-proxy.service,注意修改IP地址
[Unit]
Description=Kubernetes Proxy
After=network.target

[Service]
ExecStart=/opt/bin/kube-proxy  \
  --hostname-override=172.12.24.37 \
  --master=http://172.12.24.36:8080 \
  --logtostderr=true
Restart=on-failure

[Install]
WantedBy=multi-user.target

启动服务
sudo systemctl daemon-reload
sudo systemctl enable kube-proxy
sudo systemctl start kube-proxy


部署附件组件
部署DNS

DNS_SERVER_IP="172.18.12.12"
DNS_DOMAIN="cluster.local"
DNS_REPLICAS=1
KUBE_APISERVER_URL=http://172.12.24.36:8080

cat <<EOF > skydns.yml
apiVersion: v1
kind: ReplicationController
metadata:
  name: kube-dns-v17.1
  namespace: kube-system
  labels:
    k8s-app: kube-dns
    version: v17.1
    kubernetes.io/cluster-service: "true"
spec:
  replicas: $DNS_REPLICAS
  selector:
    k8s-app: kube-dns
    version: v17.1
  template:
    metadata:
      labels:
        k8s-app: kube-dns
        version: v17.1
        kubernetes.io/cluster-service: "true"
    spec:
      containers:
      - name: kubedns
        image: gcr.io/google_containers/kubedns-amd64:1.5
        resources:
          # TODO: Set memory limits when we've profiled the Container for large
          # clusters, then set request = limit to keep this container in
          # guaranteed class. Currently, this container falls into the
          # "burstable" category so the kubelet doesn't backoff from restarting it.
          limits:
            cpu: 100m
            memory: 170Mi
          requests:
            cpu: 100m
            memory: 70Mi
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 60
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 5
        readinessProbe:
          httpGet:
            path: /readiness
            port: 8081
            scheme: HTTP
          # we poll on pod startup for the Kubernetes master service and
          # only setup the /readiness HTTP server once that's available.
          initialDelaySeconds: 30
          timeoutSeconds: 5
        args:
        # command = "/kube-dns"
        - --domain=$DNS_DOMAIN.
        - --dns-port=10053
        - --kube-master-url=$KUBE_APISERVER_URL
        ports:
        - containerPort: 10053
          name: dns-local
          protocol: UDP
        - containerPort: 10053
          name: dns-tcp-local
          protocol: TCP
      - name: dnsmasq
        image: gcr.io/google_containers/kube-dnsmasq-amd64:1.3
        args:
        - --cache-size=1000
        - --no-resolv
        - --server=127.0.0.1#10053
        ports:
        - containerPort: 53
          name: dns
          protocol: UDP
        - containerPort: 53
          name: dns-tcp
          protocol: TCP
      - name: healthz
        image: gcr.io/google_containers/exechealthz-amd64:1.1
        resources:
          # keep request = limit to keep this container in guaranteed class
          limits:
            cpu: 10m
            memory: 50Mi
          requests:
            cpu: 10m
            # Note that this container shouldn't really need 50Mi of memory. The
            # limits are set higher than expected pending investigation on #29688.
            # The extra memory was stolen from the kubedns container to keep the
            # net memory requested by the pod constant.
            memory: 50Mi
        args:
        - -cmd=nslookup kubernetes.default.svc.$DNS_DOMAIN 127.0.0.1 >/dev/null
        - -port=8080
        - -quiet
        ports:
        - containerPort: 8080
          protocol: TCP
      dnsPolicy: Default  # Don't use cluster DNS.
---
apiVersion: v1
kind: Service
metadata:
  name: kube-dns
  namespace: kube-system
  labels:
    k8s-app: kube-dns
    kubernetes.io/cluster-service: "true"
    kubernetes.io/name: "KubeDNS"
spec:
  selector:
    k8s-app: kube-dns
  clusterIP: $DNS_SERVER_IP
  ports:
  - name: dns
    port: 53
    protocol: UDP
  - name: dns-tcp
    port: 53
    protocol: TCP
EOF

kubectl create -f skydns.yml

然后,修该各节点的kubelet.service,添加--cluster-dns=172.18.8.8以及--cluster-domain=cluster.local

部署Dashboard

echo <<'EOF' > kube-dashboard.yml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  labels:
    app: kubernetes-dashboard
    version: v1.1.0
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kubernetes-dashboard
  template:
    metadata:
      labels:
        app: kubernetes-dashboard
    spec:
      containers:
      - name: kubernetes-dashboard
        image: gcr.io/google_containers/kubernetes-dashboard-amd64:v1.1.0
        imagePullPolicy: Always
        ports:
        - containerPort: 9090
          protocol: TCP
        args:
        - --apiserver-host=http://172.12.24.36:8080
        livenessProbe:
          httpGet:
            path: /
            port: 9090
          initialDelaySeconds: 30
          timeoutSeconds: 30
---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 9090
  selector:
    app: kubernetes-dashboard
EOF

kubectl create -f kube-dashboard.yml

在Ubuntu16.04集群上手工部署Kubernetes的更多相关文章

  1. 在Ubuntu16.04集群上手工部署Kubernetes(未完,陆续补充中)

    主机信息 主机 IP OS k8s-master 10.10.10.20192.168.0.20 Ubuntu Server 16.04 k8s-node1 10.10.10.21192.168.0. ...

  2. 分布式Hbase-0.98.4在Hadoop-2.2.0集群上的部署

    fesh个人实践,欢迎经验交流!本文Blog地址:http://www.cnblogs.com/fesh/p/3898991.html Hbase 是Apache Hadoop的数据库,能够对大数据提 ...

  3. Istio(二):在Kubernetes(k8s)集群上安装部署istio1.14

    目录 一.模块概览 二.系统环境 三.安装istio 3.1 使用 Istioctl 安装 3.2 使用 Istio Operator 安装 3.3 生产部署情况如何? 3.4 平台安装指南 四.Ge ...

  4. CentOS上手工部署kubernetes集群

    本文完全是根据二进制部署kubernets集群的所有步骤,同时开启了集群的TLS安全认证. 环境说明 在下面的步骤中,我们将在三台CentOS系统的物理机上部署具有三个节点的kubernetes1.7 ...

  5. hadoop进阶----hadoop经验(一)-----生产环境hadoop部署在超大内存服务器的虚拟机集群上vs几个内存较小的物理机

    生产环境 hadoop部署在超大内存服务器的虚拟机集群上 好 还是  几个内存较小的物理机上好? 虚拟机集群优点 虚拟化会带来一些其他方面的功能. 资源隔离.有些集群是专用的,比如给你三台设备只跑一个 ...

  6. 06、部署Spark程序到集群上运行

    06.部署Spark程序到集群上运行 6.1 修改程序代码 修改文件加载路径 在spark集群上执行程序时,如果加载文件需要确保路径是所有节点能否访问到的路径,因此通常是hdfs路径地址.所以需要修改 ...

  7. [转载] 把Nutch爬虫部署到Hadoop集群上

    http://f.dataguru.cn/thread-240156-1-1.html 软件版本:Nutch 1.7, Hadoop 1.2.1, CentOS 6.5, JDK 1.7 前面的3篇文 ...

  8. 把Nutch爬虫部署到Hadoop集群上

    原文地址:http://cn.soulmachine.me/blog/20140204/ 把Nutch爬虫部署到Hadoop集群上 Feb 4th, 2014 | Comments 软件版本:Nutc ...

  9. Ganglia监控Hadoop集群的安装部署[转]

    Ganglia监控Hadoop集群的安装部署 一. 安装环境 Ubuntu server 12.04 安装gmetad的机器:192.168.52.105 安装gmond的机 器:192.168.52 ...

随机推荐

  1. .NET基础 (14)管理文件和文件夹的类型

    管理文件和文件夹的类型1 如何操作文件和文件夹2 如何实现文件和文件夹的监控功能 管理文件和文件夹的类型1 如何操作文件和文件夹 .NET内建类中提供了FileInfo和DictionaryInfo两 ...

  2. 超详细JSON解析步骤

    JSON简介 JAVAScript Object Notation是一种轻量级的数据交换格式 具有良好的可读和便于快速编写的特性. 业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了 ...

  3. 20169205实验四 Android程序设计

    20169205实验四 Android程序设计 实验内容及步骤 (一)第一个android studio项目 android studio与eclipse的传统安卓开发有一些不同之处 android ...

  4. (最短路 SPFA)Invitation Cards -- poj -- 1511

    链接: http://poj.org/problem?id=1511 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82829#probl ...

  5. SDJZUOJ迷宫问题

    题目描述 小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程. 小明只能向上下左右四个方向移动. 输入格式 输入包含多组测试数据.输入的第一行是一个整数T,表示有T组测试数据. 每组输入的第一行 ...

  6. (2)-生成JSONObject的方法

    生成JSONObject一般有两种方式,通过javabean或者map类型来生成.如下面的例子:   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 2 ...

  7. DELPHI移动端支付宝支付

    Delphi XE7 Android 应用接入支付宝SDK的方法 1      应用场景和准备工作: 采用XE系列开发的android apps. apps中需要集成支付宝的支付能力. 支付到指定的商 ...

  8. Git管理

    在bitbucket用git用法 核心流程:从远端中心repo那里git clone到本地,再在本地开发(add,commit),通常会利用branch管理,如果觉得code没问题了,就push到远端 ...

  9. windows下用wampServer 为wordpress 搭建本地服务器运行环境

      1.准备wamp server wamp是windows apache mysql php 的首字母缩写,更新的wamp总能保证wordpress对服务器的要求 点此下载最新wamp 2.安装wa ...

  10. php实现循环链表

    <?php /** * php实现链表 * Date: 2018/5/18 * Time: 下午5:59 */ class Node { public $nodeId = 0; public $ ...