kubernetes1.5新特性:新版本kubeadm
一、概述下面介绍的内容会展示如何在Ubuntu 16.04、CentOS7和HypriotOS v1.0.1+操作系统上部署一套安全的Kubernetes集群。下面介绍的安装方式是通过kubeadmin工具来完成的,这个工具在Kubernetes1.4的时候就已经被增加到Kubernetes发布包中了。在Kubernetes1.5中,kubeadmin增强了用户交互,并且修复了一些bug。
可以在本地虚拟机、物理机或者其他云服务提供商的IaaS资源上来使用kubeadmin安装Kubernetes。也可以很容易将kubeadmin集成到Terraform、 Chef、Puppet等自动化工具中。对于kubeadmin所有命令行信息介绍,可以参考http://kubernetes.io/docs/admin/kubeadm/。
在Kubernetes1.5中,Kubeadmin工具还是阿尔法版本,也就是说大家可以在研发测试环境中使用,特别需要注意的地方是kubeadmin还不能全面支持自动配置云服务提供商IaaS资源。如果在云服务提供商IaaS资源上部署,那么需要参考云服务提供商的技术文档。
Kubeadm被设计成针对大规模集群部署环境中使用的,当然也可以很容易的手动安装。如果在你自己IaaS基础架构上或者已经存在的自动化系统上部署Kubernetes,kubeadm是一个很好的选择。
二、部署前提条件
[*]有多台虚拟机或者物理机,上面操作系统是Ubuntu 16.04+、CentOS 7或者HypriotOS v1.0.1+。
[*]每台主机上面至少1G内存。
[*]所有主机之间网络可达。
三、部署目的
[*]在指定的主机上安装一套安全的Kubernetes集群。
[*]在集群上安装一个POD网络,用来允许POD之间相互通讯。
[*]在Kubernetes集群上部署一个微服务应用样例。
四、部署步骤
4.1、在主机上安装kubelet和kubeadm
在主机上安装下面软件包:
[*]docker:建议安装v1.11.2版本版本,v1.10.3版本和v1.12.1版本也可以。
[*]kubelet:安装v1.5版本
[*]kubectl: 安装v1.5版本
[*]kubeadm: 安装v1.5版本
需要注意的是,如果主机上已经安装了kubeadm,那么需要更新成Kubernetes对应的v1.5版本。
按照下面顺序来配置主机:
[*]SSH登录到主机上,并且切换成root用户。
[*]如果主机是Ubuntu或者HypriotOS,那么运行命令:
curl -shttps://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y docker.io
apt-get install -y kubelet kubeadm kubectl kubernetes-cni
如果主机是CentOS操作系统,那么运行命令:cat <<EOF > /etc/yum.repos.d/kubernetes.repo
name=Kubernetes
baseurl=http://yum.kubernetes.io/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
setenforce 0
yum install -y docker kubelet kubeadm kubectlkubernetes-cni
systemctl enable docker && systemctl start docker
systemctl enable kubelet && systemctl startkubelet
执行完上述命令后,kubelet会进入重启循环模式,每隔几秒钟就会重启,kubelte这时候再等待执行kubeadm发出的命令。
需要注意的是,需要禁用SELinux,比如通过setenforce0命令。禁用的目的是让容器可以读取主机文件系统,以便了解如何配置POD网络。
4.2、初始化Kubernetes的master节点
Kubernetes的master节点上运行着etcd和api server等组件,所有这些组件都需要通过kubelet启动。
在卸载kubernetes前,不要运行两次kubeadm init命令。
如果已经运行了kubeadm init命令,导致主机状态同kuberentes集群状态不兼容,这时候kubeadm会发送告警信息,提示目前不能正常工作,因为不满足强制要求。
可以通过下面命令初始化master节点:
# kubeadm init
需要注意的是:这个操作会自动发现网卡设备,并且将master节点上网卡设备设置成默认网关。如果想使用另外的网卡设备,那么需要在执行kubeadminit命令时增加参数--api-advertise-addresses=<ip-address>
如果你想使用flannel搭建POD网络,需要增加参数--pod-network-cidr=10.244.0.0/16。如果不适用flannel,那么就不需要这么做了。
可以参考kubeadm指南http://kubernetes.io/docs/admin/kubeadm/,在这里面可以看到更详细的kubeadmin init参数。
执行完kubeadm init命令后将会花几分钟自动下载并且安装kubernetes集群控制组件。
下面是命令执行后的输出内容:
WARNING: kubeadm is in alpha, please do not useit for production clusters.
Running pre-flight checks
Using Kubernetes version: v1.5.1
Generated token:"064158.548b9ddb1d3fad3e"
Generated Certificate Authority key andcertificate.
Generated API Server key and certificate
Generated Service Account signing keys
Created keys and certificates in"/etc/kubernetes/pki"
Wrote KubeConfig file to disk:"/etc/kubernetes/kubelet.conf"
Wrote KubeConfig file to disk:"/etc/kubernetes/admin.conf"
Created API client, waiting for the controlplane to become ready
All control plane components are healthyafter 61.317580 seconds
Waiting for at least one node to register andbecome ready
First node is ready after 6.556101 seconds
Creating a test deployment
Test deployment succeeded
Created the kube-discovery deployment,waiting for it to become ready
kube-discovery is ready after 6.020980seconds
Created essential addon: kube-proxy
Created essential addon: kube-dns
Your Kubernetes master has initialized successfully!
You should now deploy a pod network to the cluster.
Run "kubectl apply -f .yaml" withone of the options listed at:
http://kubernetes.io/docs/admin/addons/
You can now join any number of machines by running thefollowing on each node:
kubeadm join --token=<token> <master-ip>
在kubeadm join命令中,需要输入token参数,通过token参数可以确保将被授权的节点添加到kubernetes集群中,通过token参数来保证安全。
如果不在乎安全,比如安装一个单机的kubernetes开发环境,那么可以运行如下命令:
# kubectl taint nodes --all dedicated-
node "test-01" tainted
taint key="dedicated" and effect=""not found.
taint key="dedicated" and effect=""not found.
4.3、部署POD网络
在部署应用和启动kube-dns之前,需要部署POD网络,需要注意的是kubeadm只是支持基于CNI的网络,因此基于kubenet的网络不会正常工作。
可以从下面网页了解kubernetes支持的网络插件,http://kubernetes.io/docs/admin/addons/。
可以通过下面命令部署POD网络:
# kubectl apply -f <add-on.yaml>对于不同的网络插件,需要参考指定的网络插件安装指南。需要注意的是每个kuberentes集群只能部署一种POD网络。一旦部署完,需要检查kube-dns POD是否运行,通过命令kubectl get pods --all-namespaces的输出来确认网络是否正常工作。一旦kube-dns POD正常运行了,可以向kubernetes集群中添加工作节点。
4.4、向Kubernetes集群中添加工作节点
为了将工作节点添加到kubernetes集群中,对每个工作节点主机,都需要SSH到这个主机上,并且切换到root用户,然后运行命令:
# kubeadm join --token <token> <master-ip>
WARNING: kubeadm is in alpha, please do not useit for production clusters.
Running pre-flight checks
Starting the kubelet service
Validating provided token
Created cluster info discovery client,requesting info from"http://192.168.x.y:9898/cluster-info/v1/?token-id=f11877"
Cluster info object received, verifyingsignature using given token
Cluster info signature and contents arevalid, will use API endpoints
Trying to connect to endpointhttps://192.168.x.y:6443
Detected server version: v1.5.1
Successfully established connection withendpoint "https://192.168.x.y:6443"
Created API client to obtain unique certificate forthis node, generating keys and certificate signing request
Received signed certificate from the API server:
Issuer: CN=kubernetes | Subject: CN=system:node:yournode| CA: false
Not before: 2016-12-15 19:44:00 +0000 UTC Not After:2017-12-15 19:44:00 +0000 UTC
Generating kubelet configuration
Wrote KubeConfig file to disk:"/etc/kubernetes/kubelet.conf"
Node join complete:
* Certificate signing request sent to master and response
received.
* Kubelet informed of new secure connection details.
Run 'kubectl get nodes' on the master to see this machinejoin.
添加完成后,在master节点上运行命令kubectl getnodes,会显示所有已经添加到集群中的节点主机。
(可选步骤)不在master节点上操作集群,而是在其他工作节点上操作集群
需要将master节点上面的kubernetes配置文件拷贝到当前节点上,然后执行kubectl命令:
# scp root@<master ip>:/etc/kubernetes/admin.conf .
# kubectl --kubeconfig ./admin.conf get nodes
(可选步骤)连接到API Serer组件上
如果已经部署了dashboard,那么可以从集群外部连接到APIServer组件上,然后查看dashboard:
# scp root@<master ip>:/etc/kubernetes/admin.conf .
# kubectl --kubeconfig ./admin.conf proxy
可以在本地访问API Server
http://localhost:8001/api/v1(可选步骤)部署样例应用上面已经部署完成了一套kubernetes环境,下面部署一个电商微服务应用。
# kubectl create namespace sock-shop
# kubectl apply -n sock-shop -f "https://github.com/microservices-demo/microservices-demo/blob/master/deploy/kubernetes/complete-demo.yaml?raw=true"
然后查看分配给样例应用的服务信息:
# kubectl describe svc front-end -n sock-shop
Name: front-end
Namespace: sock-shop
Labels: name=front-end
Selector: name=front-end
Type: NodePort
IP: 100.66.88.176
Port: <unset> 80/TCP
NodePort: <unset> 31869/TCP
Endpoints: <none>
Session Affinity: None
经过几分钟,会下载h额启动样例应用所需容器,然后就可以通过命令kubectlget pods -n sock-shop的输出查看样例应用POD详细信息
进入到Kubernetes集群的master节点上,通过浏览器访问http://<master_ip>:<port>。在上面这个例子中,端口是31869,这个端口可以通过命令kubectl describe查询出来。
如果有防火墙,那么确保这个端口可以被访问到。
五、卸载
通过在master节点上运行命令kubectl delete namespace sock-shop 来卸载这个样例应用。
可以通过下面命令重置kubeadm工具:
# kubeadm reset
如果想重新开始,那么依次运行命令systemctl start kubelet、kubeadm init和kubeadm join。
页:
[1]