kubernetes 二进制文件离线手动安装搭建

1. 准备阶段

1.1 组建规划

主机名 地址 角色 组件
k8s-master 10.0.209.151 k8s-master etcd、kube-apiserver、kube-controller-manager、kube-scheduler
k8s-node-1 10.0.209.152 k8s-node kubelet、docker、kube_proxy
k8s-node-2 10.0.209.153 k8s-node kubelet、docker、kube_proxy

1.2 软件下载

(1) Kubernetes二进制文件下载

https://github.com/kubernetes/kubernetes/releases
从上边的网址中选择相应的版本,从 CHANGELOG页面 下载二进制文件,本文以1.12.1版本为例,如图所示为其Linux Server版本:

1.12.1 Linux Server版本

解压后,在/root/kubernetes/server/bin 路径下包含一些必须的组件:
Kubernetes文件

(2) etcd数据库下载

https://github.com/coreos/etcd/releases/
这里选用的是最新版本v3.3.10。

2. Master安装

2.1 etcd数据库安装

(1)安装

将下载的etcd文件包进行解压,解压后将etcd、etcdctl二进制文件复制到/usr/bin目录。

(2)设置服务文件etcd.service

在/usr/lib/systemd/system/目录下创建文件etcd.service,内容为:

[Unit]
Description=Etcd Server

[Service]
Type=notify
TimeoutStartSec=0
Restart=always
WorkingDirectory=/var/lib/etcd/
EnvironmentFile=-/etc/etcd/etcd.conf
ExecStart=/usr/bin/etcd 

[Install]
WantedBy=multi-user.target
  • 其中WorkingDirectory为etcd数据库目录,需要在etcd安装前创建
(3)创建配置文件/etc/etcd/etcd.conf
ETCD_NAME=ETCD Server
ETCD_DATA_DIR="/var/lib/etcd/"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://10.0.209.151:2379"
(4)配置开机启动并运行
#systemctl daemon-reload
#systemctl enable etcd.service
#systemctl start etcd.service
(5)检验etcd是否安装成功
#etcdctl cluster-health
安装etcd成功返回结果

2.2 kube-apiserver、kube-controller-manager、kube-scheduler服务安装

2.2.1 复制二进制文件到/usr/bin目录

将kube-apiserver、kube-controller-manager、kube-scheduler 三个可执行文件复制到/usr/bin目录

2.2.2 组件安装及配置
2.2.2.1 kube-apiserver

(1)新建并编辑kube-apiserver.service 文件
路径:/usr/lib/systemd/system/kube-apiserver.service,内容为:

[Unit]
Description=Kubernetes API Server
After=etcd.service
Wants=etcd.service

[Service]
EnvironmentFile=/etc/kubernetes/apiserver
ExecStart=/usr/bin/kube-apiserver  \
        $KUBE_ETCD_SERVERS \
        $KUBE_API_ADDRESS \
        $KUBE_API_PORT \
        $KUBE_SERVICE_ADDRESSES \
        $KUBE_ADMISSION_CONTROL \
        $KUBE_API_LOG \
        $KUBE_API_ARGS 
Restart=on-failure
Type=notify
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
  • 其中EnvironmentFile为kube-apiserver的配置文件
    (2)配置文件
    apiserver配置文件路径为:/etc/kubernetes/apiserver,内容为:
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--insecure-port=8080"
KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.209.151:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=192.168.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
KUBE_API_LOG="--logtostderr=false --log-dir=/var/log/kubernets/apiserver --v=2"
KUBE_API_ARGS=" "
2.2.2.2 kube-controller-manager

(1)新建并编辑kube-controller-manager.service 文件
路径:/usr/lib/systemd/system/kube-controller-manager.service,内容为:

[Unit]
Description=Kubernetes Scheduler
After=kube-apiserver.service 
Requires=kube-apiserver.service

[Service]
EnvironmentFile=-/etc/kubernetes/controller-manager
ExecStart=/usr/bin/kube-controller-manager \
        $KUBE_MASTER \
        $KUBE_CONTROLLER_MANAGER_ARGS
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

(2)配置文件
apiserver配置文件路径为:/etc/kubernetes/controller-manager,内容为:

KUBE_MASTER="--master=http://10.0.209.151:8080"
KUBE_CONTROLLER_MANAGER_ARGS=" "
2.2.2.3 kube-scheduler

(1)新建并编辑kube-scheduler 文件
路径:/usr/lib/systemd/system/kube-scheduler.service,内容为:

[Unit]
Description=Kubernetes Scheduler
After=kube-apiserver.service 
Requires=kube-apiserver.service

[Service]
User=root
EnvironmentFile=-/etc/kubernetes/scheduler
ExecStart=/usr/bin/kube-scheduler \
        $KUBE_MASTER \
        $KUBE_SCHEDULER_ARGS
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

(2)配置文件
kube-scheduler配置文件路径为:/etc/kubernetes/scheduler,内容为:

KUBE_MASTER="--master=http://10.0.209.151:8080"
KUBE_SCHEDULER_ARGS="--logtostderr=true --log-dir=/var/log/kubernetes/scheduler --v=2"
2.2.3 将各组件加入开机自启
systemctl daemon-reload 
systemctl enable kube-apiserver.service
systemctl start kube-apiserver.service
systemctl enable kube-controller-manager.service
systemctl start kube-controller-manager.service
systemctl enable kube-scheduler.service
systemctl start kube-scheduler.service

2.3 安装完后检验正确

运行命令 kubectl get cs

正确安装master返回结果

3 Node安装

Node节点上安装组件有:

  • docker
  • kube-proxy
  • kubelet

3.1 docker安装

Docker的版本需要与kubelete版本相对应,最好都使用最新的版本。

3.2 拷贝 kubelet、kube-proxy

在之前解压的 kubernetes 文件夹中拷贝二进制文件

# cp /root/kubernetes/server/bin/kubelet  /usr/bin/
# cp /root/kubernetes/server/bin/kube-proxy  /usr/bin/

3.3 kube-proxy安装

# vi /usr/lib/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
 
[Service]
EnvironmentFile=/etc/kubernetes/config
EnvironmentFile=/etc/kubernetes/proxy
ExecStart=/usr/bin/kube-proxy \
            $KUBE_LOGTOSTDERR \
            $KUBE_LOG_LEVEL \
            $KUBE_MASTER \
            $KUBE_PROXY_ARGS
Restart=on-failure
LimitNOFILE=65536
 
[Install]
WantedBy=multi-user.target

创建配置目录,并添加配置文件

# mkdir -p /etc/kubernetes
# vi /etc/kubernetes/proxy
KUBE_PROXY_ARGS=""
# vi /etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow_privileged=false"
KUBE_MASTER="--master=http://10.0.209.151:8080"

启动服务

# systemctl daemon-reload
# systemctl start kube-proxy
# netstat -lntp | grep kube-proxy
tcp        0      0 127.0.0.1:10249         0.0.0.0:*               LISTEN      12641/kube-proxy    
tcp6       0      0 :::10256                :::*                    LISTEN      12641/kube-proxy 

3.4 kubelet安装

# vi /usr/lib/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet Server
Documentation=https://github.com/GoogleCloudPlatform/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
KillMode=process
 
[Install]
WantedBy=multi-user.target
# mkdir -p /var/lib/kubelet
# vi /etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_HOSTNAME="--hostname-override=10.0.209.152"   #your node ip address
KUBELET_API_SERVER="--api-servers=http://10.0.209.151:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=reg.docker.tb/harbor/pod-infrastructure:latest"
KUBELET_ARGS="--enable-server=true --enable-debugging-handlers=true --fail-swap-on=false --kubeconfig=/var/lib/kubelet/kubeconfig"
  • 其中 “--hostname-override=10.0.209.152” 为node主机IP地址。

创建配置文件 vi /var/lib/kubelet/kubeconfig 向master进行注册

apiVersion: v1
kind: Config
users:
- name: kubelet
clusters:
- name: kubernetes
  cluster:
    server: http://10.0.209.151:8080
contexts:
- context:
    cluster: kubernetes
    user: kubelet
  name: service-account-context
current-context: service-account-context

启动kubelet并进行验证。

# systemctl daemon-reload
# systemctl start kubelet.service
#  netstat -tnlp | grep kubelet
tcp        0      0 127.0.0.1:45415         0.0.0.0:*               LISTEN      12576/kubelet       
tcp        0      0 127.0.0.1:10248         0.0.0.0:*               LISTEN      12576/kubelet       
tcp6       0      0 :::10250                :::*                    LISTEN      12576/kubelet       
tcp6       0      0 :::10255                :::*                    LISTEN      12576/kubelet 
  • 其他节点同样操作。

3.5 验证成功及问题解决

在master上执行命令kubectl get node,返回如下结果:

获取node

创建简单得nginx_test.yaml文件:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
  namespace: default
spec:
  containers:
  - image: docker.io/istio/nginx
    imagePullPolicy: IfNotPresent
    name: nginx-deployment-6499c587d8
  restartPolicy: Always

执行命令,报错如下:

# kubectl apply -f nginx_test.yaml
Error from server (ServerTimeout): error when creating "test.yaml": No API token found for service account "default", retry 
after the token is automatically created and added to the service account

原因是service account没有设置API token引起的问题,解决方法有两种:

  1. 禁用ServiceAccount
    编辑/etc/kubenetes/apiserver去除 KUBE_ADMISSION_CONTROL中的SecurityContextDeny,ServiceAccount,并重启kube-apiserver.service服务:
#vi /etc/kubernetes/apiserver
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota"

#systemctl restart kube-apiserver.service

之后重新创建pod成功。

  1. 配置ServiceAccount
    首先生成密钥,然后分别编辑apiserver和controller-manager配置文件并重启组件。
# openssl genrsa -out /etc/kubernetes/serviceaccount.key 2048
# vi /etc/kubenetes/apiserver 
KUBE_API_ARGS="--service-account-key-file=/etc/kubernetes/serviceaccount.key"     #添加
# vi /etc/kubernetes/controller-manager 
KUBE_CONTROLLER_MANAGER_ARGS="--service-account-private-key-file=/etc/kubernetes/serviceaccount.key"  # 添加

#systemctl restart kube-controller-manager.service

之后重新创建pod成功。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容