参考:Kubernetes官方文档

   Kubernetes安装方案选择

     Centos 7 配置科学上网

安装Calico网络插件

kubernetes-dashboard部署

Kubernetes安装,遇到的问题,很大部分是无法获取官方依赖镜像造成。可以选择合适的方式避开镜像获取失败问题。

比如:

1. 服务器http proxy科学上网【本文使用】

2. 服务器使用的网关可以科学上网

3. 将Kubernetes安装涉及到的docker镜像提前下载至私库(比如docker hub), 并修改安装中涉及到的yaml文件,将其中镜像修改为私库中的镜像名称。

上述方案3,本人有尝试过使用内网的Docker Registry私库,使用IP+端口Http传输镜像,kubernetes安装过程中出现Https握手失败的提示,导致安装失败。

环境

本次安装使用2台VMware虚拟机,Centos7 64位操作系统,安装Kubernetes版本为1.11.1。对于Kubernetes可以选择差不多的版本,比如1.10.x。

另外,本文涉及的操作用户是root账户。

本次部署为一个master节点,一个node节点。按需可以添加多个node节点,方法一样。

IP地址 HostName 操作系统 备注
172.16.78.243 k8s-master Centos7 64位 k8s master节点
172.16.78.244 k8s-node1 Centos7 64位 k8s node 节点
       

服务器环境初始化

1. 配置服务器科学上网

参考Centos 7 配置科学上网

将ssinit,sson,ssoff 写入bashrc:

a. 修改~/.bashrc

b. 添加以下内容:

alias ssinit='nohup sslocal -c /etc/shadowsocks.json &>> /var/log/sslocal.log &'
alias sson='export http_proxy=http://127.0.0.1:8118 && export https_proxy=http://127.0.0.1:8118 && systemctl start privoxy'
alias ssoff='unset http_proxy && unset https_proxy && systemctl stop privoxy && pkill sslocal'

c. 修改生效:

source ~/.bashrc

配置过后,执行 ssinit,sson命令,curl www.google.com 确认是否访问正常。然后ssoff关闭代理。

2. 关闭selinux

#修改/etc/selinux/config,修改SELINUX为disabled
vim /etc/selinux/config
SELINUX=disabled #执行
setenforce #重启
reboot

3. 修改各服务器上的/etc/hosts文件

添加各服务器ip与主机名关系:

172.16.78.243 k8s-master
172.16.78.244 k8s-node1

重启网络服务

service network restart

4. 各服务器时间同步

#安装ntpdate
yum install -y ntpdate
#同步北京时间
ntpdate -u cn.pool.ntp.org

Master节点部署

1. 关闭交换空间

a. free -h 查看是否有swap内存

b. swapoff -a 永久关闭交换空间

c. 注释/etc/fstab中swap条目

d. 重启服务器

2. mac地址和product_uuid要求在kubernetes集群中唯一

ifconfig

sudo cat /sys/class/dmi/id/product_uuid

3. 内网环境,关闭防火墙,或者确保涉及到的端口开放

4. 安装docker

yum install -y docker

systemctl enable docker && systemctl start docker

如果启动docker出现:

Error starting daemon: SELinux is not supported with the overlay2 graph driver on this kernel. Either boot into a newer kernel or disable selinux in docker (--selinux-enabled=false...
类似错误,可以在docker中禁用selinux。
修改/etc/sysconfig/docker,设置OPTIONS中 --selinux-enabled=false,然后systemctl restart docker重启docker。

5. docker设置http代理【需要时设置

该步骤,只在需要docker科学上网拉取镜像时使用。

a. 服务已启动代理(ssinit,sson)

b. 配置/etc/sysconfi/docker,添加代理地址

c. systemctl restart docker

备注:关闭docker http代理时,注释/etc/sysconfi/docker中的代理地址,systemctl daemon-reload,systemctl restart docker。

6. 安装 kubelet,kubeadm

本步骤涉及到的命令,务必使用Kubernetes官方文档中的命令,因为官网可能会更新。

# 务必使用官方文档中的命令进行操作,此处仅供参考
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=
gpgcheck=
repo_gpgcheck=
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpghttps://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF setenforce
yum install -y kubelet kubeadm kubectl systemctl enable kubelet && systemctl start kubelet

7. Master节点配置dcker cgrouop与kubelet一致

a. 查看docker cgroup

docker info | grep -i cgroup 查看docker的cgroup,本文中为systemd

b. 修改kubelet配置

vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
修改内容参考下图

c. 重启kubelet

systemctl daemon-reload
systemctl restart kubelet

8. 修改路由规则

# 务必使用官方文档中的命令进行操作,此处仅供参考
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables =
net.bridge.bridge-nf-call-iptables =
EOF sysctl --system
systemctl daemon-reload
systemctl restart kubelet

9. 拉取需要用到的镜像

a. 使用kubeadm config images list 列出需要的镜像

k8s.gcr.io/kube-apiserver-amd64:v1.11.1
k8s.gcr.io/kube-controller-manager-amd64:v1.11.1
k8s.gcr.io/kube-scheduler-amd64:v1.11.1
k8s.gcr.io/kube-proxy-amd64:v1.11.1
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd-amd64:3.2.
k8s.gcr.io/coredns:1.1.

b. 参考步骤docker设置http代理

c. docker pull 依次拉取a中的镜像

10 kubeadm init

需要关闭服务器http代理,关闭docker http代理

kubeadm init --pod-network-cidr=192.168.0.0/  --kubernetes-version=v1.11.1 --apiserver-advertise-address=172.16.78.243

--apiserver-advertise-address为master节点地址,--pod-network-cidr参数是网络插件Calico需要用到的 配置。

11. 根据页面提示操作

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

记录node节点加入集群命令,后期node节点安装需要使用,命令中的token 24小时后失效。

kubeadm join 172.16.78.243: --token sm4yzq.r7mwo1isrnrw2vyh --discovery-token-ca-cert-hash sha256:55989ef0da53df8ba12f9e9edef0474b351bd72b80c60dbc5eadf4ef5890c0b9

12. 安装Calico网络插件

参考安装Calico网络插件

a. 安装单节点Calico & etcd

kubectl apply -f \
https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/kubeadm/1.7/calico.yaml

b. 查看容器运行正常

watch kubectl get pods --all-namespaces

输出类似:

NAMESPACE    NAME                                       READY  STATUS   RESTARTS  AGE
kube-system calico-etcd-x2482 / Running 2m
kube-system calico-kube-controllers-6ff88bf6d4-tgtzb / Running 2m
kube-system calico-node-24h85 / Running 2m
kube-system etcd-jbaker-virtualbox / Running 6m
kube-system kube-apiserver-jbaker-virtualbox / Running 6m
kube-system kube-controller-manager-jbaker-virtualbox / Running 6m
kube-system kube-dns-545bc4bfd4-67qqp / Running 5m
kube-system kube-proxy-8fzp2 / Running 5m
kube-system kube-scheduler-jbaker-virtualbox / Running 5m

CTRL + C 推出watch命令

c. 关闭Master节点的taints

kubectl taint nodes --all node-role.kubernetes.io/master-

输出类似:

node "<your-hostname>" untainted

d. 确认运行状态

kubectl get nodes -o wide

输出类似:

NAME             STATUS  ROLES   AGE  VERSION  EXTERNAL-IP  OS-IMAGE            KERNEL-VERSION     CONTAINER-RUNTIME
<your-hostname> Ready master 1h v1..x <none> Ubuntu 16.04. LTS 4.10.--generic docker://1.12.6

13. 其他

kubeadm tear down后,可重新kubeadm init 或 kubeadm join

kubectl drain <node name> --delete-local-data --force --ignore-daemonsets  #master上运行
kubectl delete node <node name> #master上运行
kubeadm reset #被删节点上运行
rm -rf ~/.kube/ #重置master节点时运行

Node节点部署

1. kubeadm,kubelet部署

服务器按照master节点安装,执行至步骤9,不需要执行kubeadm init命令

2. docker http代理,拉取依赖镜像

quay.io/calico/cni:v3.1.3
quay.io/calico/node:v3.1.3
k8s.gcr.io/kube-proxy-amd64:v1.11.1
k8s.gcr.io/pause:3.1

3. 加入Kubernetes集群

需要关闭服务器http代理,关闭docker http代理

执行安装master节点时记录的join命令

kubeadm join 172.16.78.243: --token 2mn34f.q366f43n7nh0tjed --discovery-token-ca-cert-hash sha256:55989ef0da53df8ba12f9e9edef0474b351bd72b80c60dbc5eadf4ef5890c0b9

4. 在master节点验证

kubectl get nodes

5. 其他

master节点的token 24小时过期后,可以通过命令产生新的token:

kubeadm token create

master节点上运行命令,可查询token:

kubeadm token list

master节点上运行命令,可查询discovery-token-ca-cert-hash值:

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der >/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'

kubernetes-dashboard部署

参考 kubernetes-dashboard部署,kubernetes-dashboard版本为v1.8.3。

备注:kubectl delete -f xxx.yaml可以移除对于xxx.yaml安装的dashboard。

  • 部署

1. 使用国内私库的dashboard镜像

registry.cn-hangzhou.aliyuncs.com/jonny/kubernetes-dashboard-amd64:v1.8.3

2. master节点,下载kubernetes-danboard.yaml,修改镜像为上一步中国内镜像

wget  http://mirror.faasx.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

3. 安装

kubectl apply -f kubernetes-dashboard.yaml

4. 查看启动状态

kubectl get pods --all-namespaces

5. Master节点本机访问【跳过该步骤】

kubectl proxy
Master服务器浏览器访问
 
  • 创建用户

1. 创建admin用户

新建admin-user.yaml文件,内容如下:

apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system

执行创建命令:

kubectl create -f admin-user.yaml

2. 绑定角色

新建admin-user-role-binding.yaml文件,内容如下:

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system

执行创建命令:

kubectl create -f admin-user-role-binding.yaml

3. 获取该admin用户的访问token

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

Token:

eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLTh6anhsIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIxODNhMGZhYi05MGI0LTExZTgtODQwNy0wMDBjMjk3ZDJiNmEiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.VPjQ7FlYOH6Y6UM1e3btIknQ9vFLjQfRGfvebTvML0dYjem1my8HsEAG8hVmz8IPQh9btLwwAuCq0Rxcp5ApuKVXmFfGN5r6ej3k4hvzsEjKAPGgOzY3N3u_YdIMxw_hgbppcF8wIk8433ruz_uSrFo7x5Rve7XMAK2qlsTEJG5YxOJktfkSEPNVnHz92KicrjlIdDF8wANpJisVkdaNeSCbFaYMKWEarp_2OuZ8wzt-HVfyMgcE1Pc045wH7goXQQ0n2kJtcsTgc3X3XoTEsbG_p188OIA_MBc1k68AeycAUFm-nf1Ugn65h0GIRHw1hITmPX8iyD-H_nMfLitpVA
  • 集成Heapster插件

kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/influxdb.yaml
kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/grafana.yaml
kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/heapster.yaml
kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/rbac/heapster-rbac.yaml

使用的yaml文件是 https://github.com/kubernetes/heapster/tree/master/deploy/kube-config/influxdb 的国内镜像

  • 访问Dasshboard

本文使用的是参考文档中的API Server访问dashboard方式,可在master节点服务器外访问。用户需要安装证书访问dashboard。

1. kubectl cluster-info 查看相关信息

Kubernetes master is running at https://172.16.78.243:6443
KubeDNS is running at https://172.16.78.243:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

2. 浏览器访问dashboard

IP和端口使用上一步中的返回值对应IP和端口

https://172.16.78.243:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

此时浏览器返回403错误:

{
"kind": "Status",
"apiVersion": "v1",
"metadata": { },
"status": "Failure",
"message": "services \"https:kubernetes-dashboard:\" is forbidden: User \"system:anonymous\" cannot get services/proxy in the namespace \"kube-system\"",
"reason": "Forbidden",
"details": {
"name": "https:kubernetes-dashboard:",
"kind": "services"
},
"code":
}

3. 创建证书

# 生成client-certificate-data
grep 'client-certificate-data' ~/.kube/config | head -n | awk '{print $2}' | base64 -d >> kubecfg.crt # 生成client-key-data
grep 'client-key-data' ~/.kube/config | head -n | awk '{print $2}' | base64 -d >> kubecfg.key # 生成p12
openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"

4. 导入证书

客户端浏览器导入p12证书,重启浏览器

如果Chrome版本过新导致无法访问页面,可以使用firefox尝试。

5. 访问dashboard

选择token登入,输入之前admin用户的token

https://172.16.78.243:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

现在可以在环境上验证kubernetes相关操作了。

使用Kubeadm安装Kubernetes【单Master节点】的更多相关文章

  1. kubeadm安装K8S单master双节点集群

    宿主机:master:172.16.40.97node1:172.16.40.98node2:172.16.40.99 # 一.k8s初始化环境:(三台宿主机) 关闭防火墙和selinux syste ...

  2. kubeadm 安装Kubernetes 1.16.3 (CentOS7+IPVS+Calico)

    目录 ·  . 一.更新系统内核(全部节点) ·  . 二.基础环境设置(全部节点) ·  . 1.修改 Host ·  . 2.修改 Hostname ·  . 3.主机时间同步 ·  . 4.关闭 ...

  3. Centos7 使用 kubeadm 安装Kubernetes 1.13.3

    目录 目录 什么是Kubeadm? 什么是容器存储接口(CSI)? 什么是CoreDNS? 1.环境准备 1.1.网络配置 1.2.更改 hostname 1.3.配置 SSH 免密码登录登录 1.4 ...

  4. kubeadm安装kubernetes V1.11.1 集群

    之前测试了离线环境下使用二进制方法安装配置Kubernetes集群的方法,安装的过程中听说 kubeadm 安装配置集群更加方便,因此试着折腾了一下.安装过程中,也有一些坑,相对来说操作上要比二进制方 ...

  5. Ubuntu上kubeadm安装Kubernetes集群

    一 创建VM 3台VM,其中一台为master节点,2台work node: 二 安装相关软件 在所有节点上运行: apt-get update apt-get install apt-transpo ...

  6. 使用kubeadm安装kubernetes v1.14.1

    使用kubeadm安装kubernetes v1.14.1 一.环境准备 操作系统:Centos 7.5 ​ ⼀ 一台或多台运⾏行行着下列列系统的机器器: ​ Ubuntu 16.04+ ​ Debi ...

  7. 使用kubeadm 安装 kubernetes 1.15.1

    简介: Kubernetes作为Google开源的容器运行平台,受到了大家的热捧.搭建一套完整的kubernetes平台,也成为试用这套平台必须迈过的坎儿.kubernetes1.5版本以及之前,安装 ...

  8. 使用 kubeadm 安装 kubernetes v1.16.0

    近日通过kubeadm 安装 kubernetes v1.16.0,踩过不少坑,现记录下安装过程. 安装环境: 系           统:CentOS Linux release 7.6 Docke ...

  9. Kubernetes(K8s) 安装(使用kubeadm安装Kubernetes集群)

    背景: 由于工作发生了一些变动,很长时间没有写博客了. 概述: 这篇文章是为了介绍使用kubeadm安装Kubernetes集群(可以用于生产级别).使用了Centos 7系统. 一.Centos7 ...

  10. 【Linux】【Services】【SaaS】 kubeadm安装kubernetes

    1. 简介 2. 环境 2.1. OS:  CentOS Linux release 7.5.1804 (Core) 2.2. Ansible: 2.6.2-1.el7 2.3. docker: 2. ...

随机推荐

  1. [PHP] Laravel 5.5 图片上传功能

    以Laravel 5.5 框架为主,进行文件上传功能的实现如下: 一.配置文件修改 打开 config/filesystems.php 文件在 ‘disks’ 数组中添加如下代码 //自定义 'upl ...

  2. SQL 变形

    需求:共有协议X份,已签XX份,待签X份 sql: select count(1) 总记录数, sum(case when XY_STATUS='1' then 1 else 0 end)待签, su ...

  3. 常见网页编辑器(富文本,Markdown,代码编辑等)

    编辑器:网页不常用的功能,但却又是不可少的功能,如果要造个编辑器轮子,它可以把人玩死!!前端几大禁忌就有富文本, 为什么都说富文本编辑器是天坑? 下面记录一下常见的一些编辑器,该文随时更新: 富文本编 ...

  4. K8s StatfulSet使用总结

    StatefulSet:在1.3以前K8s中StatefulSet叫PetSet(宠物集),由此也可看出StatefulSet是关注个体,而非群体. StatefulSet要满足以下几点: 稳定且唯一 ...

  5. vue本地静态图片的路径问题解决方案

    不少人在vue的开发中遇到这样一个问题: img的src属性绑定url变量,然而图片加载失败. 大部分的情况中,是开发者使用了错误的写法,例如: <img src="{{ imgUrl ...

  6. concurrent(四)Condition

    参考文档:Java多线程系列--“JUC锁”06之 Condition条件:http://www.cnblogs.com/skywang12345/p/3496716.html Condition介绍 ...

  7. Win10,Anaconda,tensorflow-gpu安装教程

    ,参考于:https://www.cnblogs.com/guoyaohua/p/9265268.html 目录 前言 第一步:安装Anaconda 1.下载和安装 2.配置Anaconda环境变量 ...

  8. Python【每日一问】29

    问: [基础题]:给一个不多于 5 位的正整数,要求:一.求它是几位数,二.逆序印出各位数字[提高题]:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加 ...

  9. Image动画

    前几课讲的静态Image挺有趣的,但是如果能有动画的效果,那就更有趣了,mPython做出动画效果也不难.用images的列表,list. 下面就是一个列表: eggs bacon tomatoes ...

  10. BBC micro:bit引脚介绍

    另外两个大引脚(3V和GND)是非常不同的! 注意 标记为3V和GND的引脚与电路板的电源相关,千万不要连接在一起. 电源输入:如果BBC micro:bit由USB或电池供电,则可以使用3V引脚作为 ...