Rancher Kubernetes Engine(RKE)是一款轻量级Kubernetes安装程序,支持在裸机和虚拟化服务器上安装。RKE解决了Kubernetes社区中的一个常见问题:安装复杂性。使用RKE,无论您运行的是哪种操作系统和平台,Kubernetes的安装都会得到简化。
centOS7 + szss 生成3台虚拟机 (centos7 , public_network)
主机 |
ip |
内存 |
备注 |
rke(master) |
192.168.10.75 |
8G |
|
node01 |
192.168.10.84 |
8G |
|
node02 |
192.168.10.85 |
8G |
|
分别将三台机器设置不同的主机名,具体如下:
master>hostnamectl set-hostname rke
node01>hostnamectl set-hostname node01
node02>hostnamectl set-hostname node02
在主rke(master)主机上进行编辑/etc/hosts文件,增加相应主机地址与别名。
> vi /etc/hosts
在尾部加入
192.168.10.75 rke
192.168.10.84 node01
192.168.10.85 node02
通过执行ssh-keygen与ssh-copy-id完成生成ssh key以及密钥拷贝,具体代码如下:
>ssh-keygen -t rsa -P ''
或
ssh-keygen -t rsa
一路回车即可,然后拷贝key到各个需要安装的主机上即可,具体如下:
IP=(
192.168.10.75
192.168.10.84
192.168.10.85
)
for x in ${IP[*]}; do ssh-copy-id -i ~/.ssh/id_rsa.pub $x; done;
或者
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
注意:此处也要使用ssh-copy-id user1@本机IP,否则也会报错,另在centos系统下不能使用root用户进行免密设置,本例中使用szss用户(后面安装docker后普通用户需加入到docker组),上述命令需要在普通用户下执行。
使用ssh连接各主机看是否可以成功免密码登录,如果成功即可继续后续操作,具体如下:
[szss@rke ~]$ ssh node01
Last login: Tue Sep 4 10:41:12 2018
[szss@node01 ~]$
看到如上信息即表示测试成功。
运行docker的node节点需要升级到4.x内核才支持overlay2驱动,docker 存储驱动很多默认用devicemapper,存在很多问题,但目前最好建议使用overlay2,内核版本小于 3.10.0-693 的不要使用 overlay2 驱动。
建立如下脚本完成内核升级,具体bash代码如下:
#!/bin/bash
set -o errexit
set -o nounset
set -o pipefail
echo '============================================================'
echo '====================升级系统内核...========================='
echo '============================================================'
#检查内核
uname -sr
#添加升级内核的第三方库 www.elrepo.org 上有方法
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
#列出内核相关包
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
#安装最新稳定版
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
#查看内核默认启动顺序
yum --enablerepo=elrepo-kernel install kernel-ml -y
#结果显示
awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
#设置默认启动的内核,顺序index 分别是 0,1,2,3,每个人机器不一样,看清楚选择自己的index, 执行以下代码选择内核
grub2-set-default 0
echo "update Centos7 success!"
> chmod +x update-kernel.sh
> sh update-kernel.sh
[root@node01 szss]# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
CentOS Linux (4.18.5-1.el7.elrepo.x86_64) 7 (Core)
CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-91f1148ce9ae4b57ad101b9eaf23eac0) 7 (Core)
#设置默认启动的内核,顺序index 分别是 0,1,2,3,每个人机器不一样,看清楚选择自己的index
>grub2-set-default 0
#重启生效
>reboot
[root@node01 szss]# uname -a
Linux node01 4.18.5-1.el7.elrepo.x86_64
注:以上升级内核操作是在root用户下完成的。
本例中docker版本将采用17.03版本,关于docker的详细说明不在本文范畴,故而不做过多说明,直接上安装代码如下:
> sudo curl https://releases.rancher.com/install-docker/17.03.sh | sh
> sudo usermod -aG docker szss
> yum install -y yum-plugin-ovl
> systemctl stop docker
# 如该文件没有,可通过如下命令直接新建
vi /etc/docker/daemon.json
{
"storage-driver": "overlay2"
}
#如果使用 Docker EE 并且版本大于 17.06,还需要一个 storage-opts,这样配置
{
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
> systemctl start docker
> docker info
##查看Storage Driver类型是不是overlay2,其具体内容如下:
Containers: 10
Running: 8
Paused: 0
Stopped: 2
Images: 6
Server Version: 17.03.2-ce
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 4ab9917febca54791c5f071a9d1f404867857fcc
runc version: 54296cf40ad8143b62dbcaa1d90e520a2136ddfe
init version: 949e6fa
Security Options:
seccomp
Profile: default
Kernel Version: 4.18.5-1.el7.elrepo.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 15.38 GiB
Name: node01
ID: ZUUY:Y6C7:VWRM:YEB3:I7X5:PCMB:UK3Z:D4W5:RKGJ:E7OK:ZKHE:MEQJ
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
WARNING: bridge-nf-call-ip6tables is disabled
> systemctl enable docker
注:此处设置开机启动后reboot时在普通szss用户模式下即可直接使用docker命令,无须再次启动docker服务。
RKE是一种快速,通用的Kubernetes安装程序,可用于在Linux主机上安装Kubernetes。您可以通过几个简单快捷的步骤开始:
下载RKE二进制文件
准备Kubernetes集群的节点
创建群集配置文件
使用RKE部署Kubernetes
与Kubernetes集群的交互
在工作站上,打开Web浏览器并导航到RKE版本页面。下载适用于您的操作系统的最新RKE安装程序:
Linux:rke_linux-amd64
使您刚下载的RKE二进制文件成为可执行文件。打开终端,将目录更改为RKE二进制文件的位置,然后运行以下命令之一。
#Linux
$ mv rke_linux-amd64 rke
$ chmod +x rke
#Linux
$ ./rke --version
Kubernetes集群组件在Linux发行版上使用Docker启动。可以使用任何所需的Linux,只要可以在其上安装Docker,本例中就是上述准备的master、node01与node02这三台机器。
RKE使用群集配置文件,称为cluster.yml
确定群集中的节点以及如何部署Kubernetes。有许多配置选项,可以在设置cluster.yml
。在本示例中,将为Kubernetes集群假设最少一个节点。
有两种简单的方法可以创建cluster.yml
:
使用我们的最小值cluster.yml并根据您将使用的节点更新它。
使用rke config
来查询所需的所有信息。
rke config
使用默认方式创建cluster.yml
要创建新的cluster.yml
,运行rke config
并且此命令会提示您输入构建群集所需的所有信息。查看群集配置选项以了解每个问题的含义。
./rke config
在回答问题列表后,cluster.yml
在您启动rke config
命令的目录中创建了一个。在之后cluster.yml
被创建,您可以编辑该文件进行任何更改。
指定名称创建cluster.yml
$ rke config --name cluster.yml
在回答问题列表后,cluster.yml
在您启动rke config
命令的目录中创建了一个。
创建一个空 cluster.yml
如果需要空cluster.yml
模板,可以使用该--empty
标志以生成模板,但模板中没有值。
$ rke config --empty --name cluster.yml
打印 cluster.yml
您可以使用--print
标志将生成的配置打印到stdout,而不是创建文件。
$ rke config --print
RKE已准备好HA,您可以controlplane
在cluster.yml
文件中指定多个节点。RKE将在所有这些节点上部署主组件,并且kubelet被配置为127.0.0.1:6443
默认连接,这是nginx-proxy
代理向所有主节点请求的服务的地址。
要创建HA群集,请指定多个具有角色的主机controlplane
。
创建完成后cluster.yml
,可以使用简单的命令部署集群。此命令假定该cluster.yml
文件与运行该命令的目录位于同一目录中。
#Linux
$ ./rke up
#或者
$ ./rke up --config cluster.yml
本例cluster.yml样例
# If you intened to deploy Kubernetes in an air-gapped environment,
# please consult the documentation on how to configure custom RKE images.
nodes:
- address: 192.168.10.75
port: "22"
internal_address: ""
role:
- controlplane
- etcd
hostname_override: rke
user: szss
docker_socket: /var/run/docker.sock
ssh_key: ""
ssh_key_path: /home/szss/.ssh/id_rsa
labels: {}
- address: "192.168.10.84"
port: "22"
role:
- worker
hostname_override: node01
user: szss
docker_socket: /var/run/docker.sock
ssh_key: ""
ssh_key_path: /home/szss/.ssh/id_rsa
labels: {}
- address: "192.168.10.85"
port: "22"
role:
- worker
hostname_override: node02
user: szss
docker_socket: /var/run/docker.sock
ssh_key: ""
ssh_key_path: /home/szss/.ssh/id_rsa
labels: {}
services:
etcd:
image: ""
extra_args: {}
extra_binds: []
extra_env: []
external_urls: []
ca_cert: ""
cert: ""
key: ""
path: ""
snapshot: false
retention: ""
creation: ""
kube-api:
image: ""
extra_args: {}
extra_binds: []
extra_env: []
service_cluster_ip_range: 10.43.0.0/16
service_node_port_range: ""
pod_security_policy: false
kube-controller:
image: ""
extra_args: {}
extra_binds: []
extra_env: []
cluster_cidr: 10.42.0.0/16
service_cluster_ip_range: 10.43.0.0/16
scheduler:
image: ""
extra_args: {}
extra_binds: []
extra_env: []
kubelet:
image: ""
extra_args: {}
extra_binds: []
extra_env: []
cluster_domain: cluster.local
infra_container_image: ""
cluster_dns_server: 10.43.0.10
fail_swap_on: false
kubeproxy:
image: ""
extra_args: {}
extra_binds: []
extra_env: []
network:
plugin: flannel
options: {}
authentication:
strategy: x509
options: {}
sans: []
addons: ""
addons_include: []
system_images:
etcd: rancher/coreos-etcd:v3.2.18
alpine: rancher/rke-tools:v0.1.13
nginx_proxy: rancher/rke-tools:v0.1.13
cert_downloader: rancher/rke-tools:v0.1.13
kubernetes_services_sidecar: rancher/rke-tools:v0.1.13
kubedns: rancher/k8s-dns-kube-dns-amd64:1.14.10
dnsmasq: rancher/k8s-dns-dnsmasq-nanny-amd64:1.14.10
kubedns_sidecar: rancher/k8s-dns-sidecar-amd64:1.14.10
kubedns_autoscaler: rancher/cluster-proportional-autoscaler-amd64:1.0.0
kubernetes: rancher/hyperkube:v1.11.1-rancher1
flannel: rancher/coreos-flannel:v0.9.1
flannel_cni: rancher/coreos-flannel-cni:v0.2.0
calico_node: rancher/calico-node:v3.1.1
calico_cni: rancher/calico-cni:v3.1.1
calico_controllers: ""
calico_ctl: rancher/calico-ctl:v2.0.0
canal_node: rancher/calico-node:v3.1.1
canal_cni: rancher/calico-cni:v3.1.1
canal_flannel: rancher/coreos-flannel:v0.9.1
wave_node: weaveworks/weave-kube:2.1.2
weave_cni: weaveworks/weave-npc:2.1.2
pod_infra_container: rancher/pause-amd64:3.1
ingress: rancher/nginx-ingress-controller:0.16.2-rancher1
ingress_backend: rancher/nginx-ingress-controller-defaultbackend:1.4
metrics_server: rancher/metrics-server-amd64:v0.2.1
ssh_key_path: ~/.ssh/id_rsa
ssh_agent_auth: false
authorization:
mode: rbac
options: {}
ignore_docker_version: false
kubernetes_version: ""
private_registries: []
ingress:
provider: ""
options: {}
node_selector: {}
extra_args: {}
cluster_name: ""
cloud_provider:
name: ""
prefix_path: ""
addon_job_timeout: 0
bastion_host:
address: ""
port: ""
user: ""
ssh_key: ""
ssh_key_path: ""
monitoring:
provider: ""
options: {}
在创建Kubernetes集群时会有日志语句。
$ ./rke up --config cluster.yml
INFO [0000]构建Kubernetes集群
INFO [dialer]主机设置隧道[10.0.0.1]
INFO [network]部署端口侦听器容器
信息[网络]在主机[10.0.0.1]上拉图像[alpine:latest]
...
信息[0101]成功建造Kubernetes集群
应该读取最后一行Finished building Kubernetes cluster successfully
以指示您的群集已准备好使用。作为Kubernetes创建过程的一部分,kubeconfig
已创建并编写了一个文件,该文件kube_config_cluster.yml
可用于开始交互您的Kubernetes集群。
为了开始与Kubernetes集群进行交互,将使用另一个名为的二进制文件kubectl
。您需要在本地计算机上安装kubectl。您可以使用kube_config_cluster.yml
部署Kubernetes时生成的集群连接到RKE创建的集群。
#通过检查Kubernetes集群的版本来确认kubectl正在运行
$ kubectl --kubeconfig kube_config_cluster.yml版本
客户端版本:version.Info {Major:“1”,Minor:“10”,GitVersion:“v1.10.0”,GitCommit:“fc32d2f3698e36b93322a3465f63a14e9f0eaead”,GitTreeState:“clean”,BuildDate:“2018-03-27T00:13: 02Z“,GoVersion:”go1.9.4“,编译:”gc“,平台:”darwin / amd64“}
服务器版本:version.Info {Major:“1”,Minor:“8+”,GitVersion:“v1.8.9-rancher1”,GitCommit:“68595e18f25e24125244e9966b1e5468a98c1cd4”,GitTreeState:“clean”,BuildDate:“2018-03-13T04 :37:53Z“,GoVersion:”go1.8.3“,编译:”gc“,平台:”linux / amd64“}
报告客户端和服务器版本,表明您具有本地kubectl
客户端,并且能够从新构建的群集请求服务器版本。现在,您可以向群集发出任何kubectl命令,例如请求群集中的节点。
$ kubectl --kubeconfig kube_config_cluster.yml获取节点
名称状态改变年龄版本
10.0.0.1就绪控制平面,etcd,worker 35m v1.10.3-rancher1
下载kubectl安装包
wget https://centos-k8s.oss-cn-hangzhou.aliyuncs.com/rpm/1.8.4/kubectl
chmod a+x kubectl
mv kubectl /usr/bin
RKE会在配置文件所在的目录下部署一个本地文件,该文件中包含kube配置信息以连接到新生成的群集。默认情况下,kube配置文件被称为.kube_config_cluster.yml。将这个文件复制到你的本地~/.kube/config,就可以在本地使用kubectl了。
mkdir .kube
cp kube_config_cluster.yml .kube/config
输入命令:
[szss@test01 ~]$ kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
kube-dns-7588d5b5f5-rhrzw 3/3 Running 0 2m
kube-dns-autoscaler-5db9bbb766-zx4p2 1/1 Running 0 3h
kube-flannel-pfshk 2/2 Running 0 3h
kube-flannel-s9nlk 2/2 Running 0 3h
kube-flannel-wx8l5 2/2 Running 0 3h
metrics-server-97bc649d5-fs8v7 1/1 Running 0 2m
则可以看到所有的pod都是Running状态,如果有ContainerCreating状态,请等待。其他状态的话请查看日志,是否有错误。
至此完成了最基础的基于RKE的kubernetes的安装工作,后期就可以进行相应的微服务架构的构建了与应用了!
注:如果在安装过程中报错的话,请检查szss用户是否加入了docker组以及rke主机是否设置了免密登录,进行了ssh-copy-id的操作。