kubernetes

Kubernetes安装笔记

这是一篇介绍如何手动一步一步安装配置kubernetes的文章,主要为了确保读者了解启动kubernetes集群所需的每个任务。

集群信息

 

  • kube master 192.168.66.246 hostname: controller-0
  • kube node1 192.168.65.69 hostname: worker-0
  • kube node2 192.168.64.255 hostname: worker-1
  • pod CIDR 192.168.192.0/18
  • service CIDR 192.168.128.0/23

安装客户端工具

接下来我们先要安装几个命令行工具:cfsslcfssljson, and kubectl.

安装CFSSL

cfssl and cfssljson用来配置PKI基础架构并创建TLS证书

cfssl repository下载安装cfssl和cfssljson

OS X

Linux

验证

验证已经安装了cfssl的1.20或者更高的版本

输出

安装 kubectl

kuberctl命令是用来和Kubernetes API服务进行交互的。可以从官方发布的二进制文件下载并安装:

OS X

Linux

验证

Verify kubectl version 1.8.0 or higher is installed:

输出结果

配置CA并生成TLS证书

Certificate Authority

创建CA配置文件:

创建CA证书签名请求:

生成CA证书和私钥:

结果如下:

管理员客户端证书

创建管理客户端证书签名请求:

生成管理客户端证私钥:

结果如下:

kube-proxy客户端证书

创建kube-proxy客户端证书签名请求:

生成kube-proxy客户端证书和私钥:

结果如下:

Kubernetes API Server Certificate

在创建API服务器证书时,建议把外部静态ip也加入到证书列表中,这样可以确保证书可以被远程客户端验证。如果有多个master,请一并把所有master内网ip加入到列表中。

创建Kubernetes API服务器证书签名请求:

生成Kubernetes API服务器证书和私钥:

结果如下:

创建管理Kubernetes的配置文件

适合作为admin用户进行身份验证的kubeconfig文件:

安装配置etcd服务

如果是生产环境使用,建议最少三台etcd服务。

拷贝证书文件到etcd服务器,蚊子这里使用kube-master服务器配置etcd服务

从 coreos/etcd GitHub项目直接下载etcd的二进制文件

解压etcd二进制文件

配置etcd服务

每个etcd的name必须是独立,所以需要给每个etcd服务设置一个单独的name,这里使用的当前server的hostname

创建 etcd.service systemd unit文件:

启动etcd服务

如果有多台etcd服务器,上面的命令和配置要在每台服务器上执行

验证

列出etcd服务器列表

输出结果:

安装配置kube-master服务器

生成数据加密配置和密钥

加密密钥

加密配置文件

将加密配置文件和相关证书文件拷贝到kube-master机器上

安装配置docker环境

对于ubuntu 16.04下docker环境的安装配置请参考如下网址,蚊子这里就不在赘述了

https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#install-docker-ce-1

下载并安装Kubernetes Controller二进制文件

配置Kubernetes API Server

创建 kube-apiserver.service systemd unit文件

配置Kubernetes Controller Manager

创建 kube-controller-manager.service systemd unit 文件

配置 Kubernetes Scheduler

创建kube-scheduler.service systemd unit文件

 安装配置calico

下载 calicoctl二进制文件

创建calico-node.service systemd unit文件

启动kube-master上个各项服务

验证

RBAC for Kubelet授权

接下来将配置RBAC权限,以允许Kubernetes API服务器访问每个工作者节点上的Kubelet API。 只有有权限访问Kubelet API才能获取pods的信息,日志甚至是在pods上执行命令。

在本文档中,我们将kube-node上的kubelet服务的–authorization-mode参数设置成了Webhook。Webhook模式使用SubjectAccessReview API来确定授权。

创建system:kube-apiserver-to-kubelet ClusterRole 受权访问Kubelet API和管理pods的可执行的常规任务

Kubernetes API Server授权Kubelet作为kubernetes用户使用–kubelet-client-certificate参数定义的证书来进行身份验证。

绑定system:kube-apiserver-to-kubelet ClusterRole到kubernetes用户

安装配置kube-node服务器

创建Kubelet客户端证书

Kubernetes使用称为Node Authorizer的特殊用途授权模式,专门授权Kubelets创建的API请求。 为了得到Node Authorizer的授权,Kubelets必须使用一个证书来标识它们在system:nodes group中,其用户名为system:node:<nodeName>。 现在将为每个满足节点授权者要求的Kubernetes worker节点创建一个证书。

为kube-node都需要创建客户端证书和私钥,这里以worker-0为例

${EXTERNAL_IP}请自行替换成服务器的外网ip,如果有的话,没有的话,请删除。

输出结果

拷贝证书文件到worker-0服务器

用于身份验证的Kubernetes配置文件

我们先来创建kubelet 和 kube-proxy需要使用的kubeconfig文件

scheduler 和 controller manager通过本地不需要认证的不安全接口来访问Kubernetes API服务,Kubernetes API服务器的不安全端口仅用于本地访问。

首先要为每台kube-node服务器创建kubeconfig文件,这里以worker-0为例。

结果:

接下来创建kube-proxy kubeconfig文件

拷贝kubelet 和 kube-proxy kubeconfig文件到worker-0服务器

安装配置docker环境

对于ubuntu 16.04下docker环境的安装配置请参考如下网址,蚊子这里就不在赘述了

https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#install-docker-ce-1

安装配置kube-node

安装socat

socat提供kubectl 端口转发命令的支持

下载woker二进制文件

创建安装目录

安装worker二进制文件

配置CNI网络

配置Kubelet

创建kubelet.service systemd unit文件

配置Kubernetes Proxy

创建kube-proxy.service systemd unit文件

创建calico-node.service systemd unit文件

启动kube-node服务

验证

输出

部署DNS add-on

DNS add-on为在Kubernetes集群内运行的应用程序提供基于DNS的服务发现。

输出结果

列出由kube-dns deployment创建的pods

输出结果

验证DNS add-on

先来创建一个busybox的deployment

列出由busybox deployment创建的pods

输出结果

dns查询测试

输出结果

写到此处,我们的kubernetes cluster就算搭建完成了。接下来,我们部署一个nginx来验证kubernetes环境的可用性。

kubernetes cluster功能性测试

数据加密

创建一个secret

打印存储在etcd中的kubernetes-the-hard-way secret的hexdump,在kube-master执行

输出结果

etcd密钥应以k8s:enc:aescbc:v1:key1为前缀,表示aescbc provider使用key1加密密钥加密数据。

Deployments

先来创建一个nginx web服务的deployment

列出nginx deployment创建的pod

输出结果

端口转发

获取到nginx pod的name

转发8080端口到nginx的80端口

输出结果

我们来访问一下本机的8080端口看下效果

输出结果

从此看来,我们的端口转发功能是好的,可以通过映射出来的8080端口访问到pod中的nginx,我们来停止端口转发

查看日志

运行如下命令查看pod中的nginx的日志

输出结果

能看到我们刚才在命令行下用curl命令访问的日志内容

Exec命令

我们要在nginx的pod中执行nginx -v命令来显示nginx的版本号,命令如下

显示如下

测试kubenetes的service

使用NodePort服务暴露nginx的deployment

获取分配给nginx service的node port

这样我们就能直接通过kube-node的ip加上node port的端口直接访问pod里的nginx了,让我们来试试吧

输出结果

哇,是不是很神奇。到此,kubernetes cluster的主要功能部分就都测试完,都完美的通了测试,得到了我们预想的结果。到此,本文档所介绍的内容也就算告一个段落了。各位读者朋友们在一步一步配置的过程中,如果遇到了什么困难或问题,欢迎来和蚊子一起探讨,如果本文有不正确的地方,还望指正。

参考文档:

https://github.com/kelseyhightower/kubernetes-the-hard-way

https://docs.projectcalico.org/v3.0/introduction/

https://kubernetes.io/docs/home/

Leave a Reply

Your email address will not be published. Required fields are marked *