欢迎访问www.showerlee.com, 您的支持就是我前进的动力.

Kubernates1.9+Docker17离线安装部署

showerlee 2018-02-13 17:00 DevTools, Kubernetes 阅读 (20,686) 5条评论

image

最近研究了一下目前比较火的Kubernetes(k8s), 重点关注了下它最新的1.9版本, 这个版本较老的1.1版本的确简化了很多配置, 它利用kubeadm这个工具对全局进行批量化部署, 减轻了我们初学者起步的学习成本. 

目前主流的安装k8s系统平台有Centos7和ubuntu, 这里笔者因为对centos有常年的运维开发经验, 所以就选择前者.

另外官方已经在近期将kubernetes1.1版本的centos7配置从官网移除, 所以建议大家使用1.9版本完成所有的安装部署.

本文档推荐给大家的原因是因为目前网上基本上没有一个较为完整和正确率较高的k8s的安装文档, 笔者因此整合了网上零散的k8s资源, 给大家提供一个较为靠谱的离线安装k8s 1.9版本的安装范例.

什么是Kubernates?

Kubernetes 用于自动部署、扩展和管理容器化(containerized)应用程序的开源系统。它旨在提供“跨主机集群的自动部署、扩展以及运行应用程序容器的平台”。它支持一系列容器工具, 目前主流会使用Docker作为他的主流配置容器.

为什么要使用离线安装呢?

因为kubeadm默认要从google仓库下载镜像,但目前国内无法访问google仓库,所以这里从网上找到1.9的离线安装包,大家只需要将离线包的镜像导入到相应节点即可.

Let's start...

安装环境

Local Desktop: MacOS

Virtual Machine: Virtual Box

Virtual System: CentOS 7.4

Kubernetes: Kubernetes1.9

Docker: 17.03.2-ce

kube-master 10.110.16.10

kube-node-1 10.110.16.11

一. 系统环境配置

(Master Node都需要配置)

1.下载离线安装包

链接: https://pan.baidu.com/s/1c2O1gIW 密码: 9s92

下载到本地后, 上传到虚拟机root根目录

# tar jxvf k8s_images.tar.bz2

2. 安装依赖

Tip: 这里需要更新CentOS7内核到最新版本才能打开centos的路由功能以供k8s使用, 更新完毕需要重启系统使kernel新版本生效

# yum install policycoreutils-python libtool-ltdl libseccomp device-mapper-libs kernel ntpdate

# reboot

3.绑定本地host

# echo "10.110.16.10 kube-master" >> /etc/hosts

# echo "10.110.16.11 kube-node-1" >> /etc/hosts

4.添加kube-master到kube-node-1的秘钥认证(仅Master需要配置)

# ssh-keygen

# ssh-copy-id kube-node-1

5.关闭SELINUX和firewall

# vi /etc/sysconfig/selinux

...
SELINUX=disabled 
...

# setenforce 0

# systemctl stop firewalld  && systemctl disable firewalld

6.路由配置

# modprobe br_netfilter

# echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf

# echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf

# sysctl -p

7.关闭Swap分区

大家在安装CentOS7时如果配置了swap分区, 这里由于k8s禁止系统开启此功能, 需要提前进行关闭, 没有配置swap请无视.

查看swap分区目录

# swapon -s

Filename                                Type            Size    Used    Priority
/swapfile                               file    1996796 1214364 -1

关闭swap分区

# swapoff /swapfile

注释掉swap分区, 禁止开机启动swap

# vi /etc/fstab

...
#/dev/mapper/centos-swap swap                    swap    defaults        0 0
...

8.开启系统时间同步

# systemctl enable ntpdate && systemctl start ntpdate

二. Docker配置

(Master Node都需要配置)

1.安装docker-ce17.03

# rpm -ihv docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm
# rpm -ivh docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm

2.修改Docker使用阿里的镜像

Tip: 访问https://cr.console.aliyun.com/#/accelerator注册账号, 在镜像加速器里获取个人的仓库地址, 并填入如下配置文件

# mkdir /etc/docker

# vi /etc/docker/daemon.json

...
{
  "registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"]
}
...

3.重启docker并设置开机启动
# systemctl daemon-reload
# systemctl restart docker
# systemctl enable docker

4.本地载入我们的离线镜像

# cd /root

# mv /root/k8s_images/docker_images/etcd-amd64\:v3.1.10.tar /root/k8s_images/docker_images/etcd-amd64_v3.1.10.tar

# vi load_image.sh

docker load < /root/k8s_images/docker_images/etcd-amd64_v3.1.10.tar
docker load </root/k8s_images/docker_images/flannel_v0.9.1-amd64.tar
docker load </root/k8s_images/docker_images/k8s-dns-dnsmasq-nanny-amd64_v1.14.7.tar
docker load </root/k8s_images/docker_images/k8s-dns-kube-dns-amd64_1.14.7.tar
docker load </root/k8s_images/docker_images/k8s-dns-sidecar-amd64_1.14.7.tar
docker load </root/k8s_images/docker_images/kube-apiserver-amd64_v1.9.0.tar
docker load </root/k8s_images/docker_images/kube-controller-manager-amd64_v1.9.0.tar
docker load </root/k8s_images/docker_images/kube-scheduler-amd64_v1.9.0.tar
docker load < /root/k8s_images/docker_images/kube-proxy-amd64_v1.9.0.tar
docker load </root/k8s_images/docker_images/pause-amd64_3.0.tar
docker load < /root/k8s_images/kubernetes-dashboard_v1.8.1.tar

# sh load_image.sh

三.Kubernetes配置

1.安装kubelet kubeadm kubectl(Master Node都需要配置)

# cd k8s_images
# rpm -ivh socat-1.7.3.2-2.el7.x86_64.rpm
# rpm -ivh kubernetes-cni-0.6.0-0.x86_64.rpm  kubelet-1.9.9-9.x86_64.rpm kubectl-1.9.0-0.x86_64.rpm
# rpm -ivh kubeadm-1.9.0-0.x86_64.rpm

2.重启kubelet并设置开机启动(Master Node都需要配置)

# systemctl enable kubelet && sudo systemctl start kubelet

3.修改docker配置文件中的Cgroup Driver参数与k8s一致(Master Node都需要配置)

# docker info |grep "Cgroup Driver"
如果"Cgroup Driver"value为 "cgroupfs", 将其值写入kubeadm配置文件
# vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

...
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver="cgroupfs"
...

# systemctl daemon-reload && systemctl restart kubelet

4.Master初始化(Master 需要配置)

# kubeadm reset

# kubeadm init --kubernetes-version=v1.9.0 --pod-network-cidr=10.244.0.0/16

Tip: 这里的10.244.0.0/16与默认的配置文件网段一致, 如需调整请在后面的kube-flannel.yml文件做相应改变

如果一切没问题会output一个token返回命令

# kubeadm join --token 288f34.481c8faa5636966f 10.110.16.10:6443 --discovery-token-ca-cert-hash sha256:8036fac3b76e1a0dd189edaa8f7d36f2b51429dd0c0cf7ea0d78e7972d611002

24小时后这个token会失效, 需要重新生成, 使用如下命令进行生成.

# kubeadm token create

# kubeadm join --token "Your token code" "Your master ip address":6443

如果在24小时内忘记了,可以用如下命令获取.

# kubeadm token list

5.设置用户环境变量(Master 需要配置)

如果你使用的是root
# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
# source ~/.bash_profile

如果是非root用户

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

测试kubectl版本

# kubectl version

Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2017-12-15T21:07:38Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2017-12-15T20:55:30Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}

6.使用flannel组件进行k8s网络配置(Master 需要配置)

# wget https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

Tip: 这里的yml配置文件内的网段配置需与上面介绍的Master初始化的配置网段"--pod-network-cidr=10.244.0.0/16" 一致

# kubectl create -f kube-flannel.yml

7.查看所有pod详细信息(Master 需要配置)

# kubectl get pod --all-namespaces -o wide

# kubectl describe pods

8.添加Node(Node 需要配置)

从Master初始化输出中获取

# kubeadm join --token 288f34.481c8faa5636966f 10.110.16.10:6443 --discovery-token-ca-cert-hash sha256:8036fac3b76e1e0dd189edaa8f7d36f1b51429dd0c0cf7ea0d78e7972d611002

Tip:这里作为可选, 因为笔者将Master加入Node调度中, 让其同时充当Master和Node的角色, 如果资源有限只有一台测试机的小伙伴这步可以略过.

9.将Master加入Node schedual调度(Master 需要配置)

Tip: 默认Master不会加入Node调度, 这里使用如下命令开启这个限制.

# kubectl taint nodes kube-master node-role.kubernetes.io/master-

如果我们有多个node需要手动去做调度, 从而不让我们的pod进入该node调度列表, 可以使用如下命令:

禁用该node调度

# kubectl cordon kube-node-1

查看是否禁用

# kubectl get node kube-node-1

NAME          STATUS                     ROLES     AGE       VERSION
kube-node-1   Ready,SchedulingDisabled   node    11d       v1.9.0

解禁该node调度

# kubectl uncordon kube-node-1

查看是否解禁

# kubectl get nodes kube-node-1

NAME          STATUS  ROLES     AGE       VERSION
kube-node-1   Ready   node    11d       v1.9.0

10.测试K8s cluster(Master 需要配置)

我们利用k8s创建一个apache的网站实例, 镜像为httpd, 并设置2个副本. 

# kubectl run httpd-app --image=httpd --replicas=2

# kubectl get deployment

NAME        DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
httpd-app   2         2         2            2           2h

# kubectl get pods -o wide

NAME                         READY     STATUS    RESTARTS   AGE       IP            NODE
httpd-app-5fbccd7c6c-27nzv   1/1       Running   0          2h        10.244.0.13   kube-master
httpd-app-5fbccd7c6c-n9qs2   1/1       Running   0          2h        10.244.0.12   kube-master

11.测试网站实例(Master 需要配置)

# curl 10.244.0.13

<html><body><h1>It works!</h1></body></html>

curl 10.244.0.12

<html><body><h1>It works!</h1></body></html>

12.安装kubernetes-dashboard(Master 需要配置)

Tip:默认kubernetes是没有图形管理界面, 我们这里通过添加一个dashboard容器去添加一个可管理的GUI界面

# cd /root/k8s_images

添加dashboard容器

# kubectl create -f kubernetes-dashboard.yaml

创建认证文件

# vi /etc/kubernetes/pki/basic_auth_file

#user,password,userid
admin,admin,2

配置dashboard basic认证

# vi /etc/kubernetes/manifests/kube-apiserver.yaml

添加一行:

- --basic_auth_file=/etc/kubernetes/pki/basic_auth_file

如下:

...
- --etcd-servers=http://127.0.0.1:2379
- --basic_auth_file=/etc/kubernetes/pki/basic_auth_file
image: gcr.io/google_containers/kube-apiserver-amd64:v1.9.0
...

更新认证配置

kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml (可不执行, 待验证)

# systemctl restart kubelet

将admin账号加入cluster-admin的role, 获取k8s最高系统权限

# kubectl create clusterrolebinding login-on-dashboard-with-cluster-admin --clusterrole=cluster-admin --user=admin

访问dashboard主页

https://10.110.16.10:32666

账号/密码: admin/admin

k8s-dashboard

overview

大功告成...

更多kubernetes组件介绍:

Kubernetes之Pod, Replicaset, Deployment, Label, Service

Kubernetes之Persistent Volume(持久化卷)

Kubernetes之Secrets与Config Maps

Kubernetes之Helm包管理

正文部分到此结束
版权声明:除非注明,本文由(showerlee)原创,转载请保留文章出处!
本文链接:http://www.showerlee.com/archives/2200

继续浏览:k8s

5条大神的评论

loading
  1. 沙发
    keep2018年7月21日下午6:31 回复

    请教一下,dashboard既然是https 的访问方式,是否可以配置证书?

    • showerlee2018年7月21日下午8:13 回复

      证书是可以配置的, 具体你可以查看官方文档

  2. 板凳
    baozi2018年9月5日下午3:26 回复

    我安装完成后,为什么总提示这个错误:The connection to the server 10.5.5.242:8080 was refused – did you specify the right host or port?并且我在主服务器上无法发现apiserver的映射端口,但是这个的docker正常工作

  3. 地板
    Allen2019年4月3日下午5:46 回复

    请教一下,按照这个教程配置了以后,为啥访问dashboard的时候没有办法访问成功呢?第十一步的测试网站实例,搭建了以后curl IP会提示拒绝链接。防火墙和SELINUX也已经关闭了。

发表评论

icon_wink.gif icon_neutral.gif icon_mad.gif icon_twisted.gif icon_smile.gif icon_eek.gif icon_sad.gif icon_rolleyes.gif icon_razz.gif icon_redface.gif icon_surprised.gif icon_mrgreen.gif icon_lol.gif icon_idea.gif icon_biggrin.gif icon_evil.gif icon_cry.gif icon_cool.gif icon_arrow.gif icon_confused.gif icon_question.gif icon_exclaim.gif