本文将使用kubernetes-ansible进行安装,由于其kubernetes-ansible更新很快,细小的地方又发生了一定变化,简单记录一下,同时由于特殊原因,一般网内用户都无法正常运行k8s。所以这个系列准备写一些咱们自己能用的例子来学习k8s的基础知识。

构成说明

演示程序使用下列的集群构成。

NotypeIPOS
1master192.168.32.131CENTOS7.2
2etcd192.168.32.131CENTOS7.2
3minion192.168.32.132CENTOS7.2
3minion192.168.32.133CENTOS7.2
3minion192.168.32.134CENTOS7.2

Step 1:安装ansible

在192.168.32.131上安装ansible

[root@host131 local]# yum -y install epel-release
[root@host131 local]# yum -y install ansible

确认安装

[root@host131 local]# ansible --version
ansible 2.1.0.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides
[root@host131 local]#

Step 2:设定ssh通路和ansible

分别在4台机器上生成ssh的key
设定4台机器的/etc/hosts
设定4台机器ssh通路
在ansible所安装的机器上,追加机器信息到/etc/ansible/hosts中
确认ansible正常动作

Step 3:下载contrib

[root@host31 local]# cd ..
[root@host31 /]# mkdir -p /local; cd /local
[root@host131 local]# git clone https://github.com/kubernetes/contrib
Cloning into 'contrib'...
remote: Counting objects: 30938, done.
remote: Compressing objects: 100% (31/31), done.
remote: Total 30938 (delta 12), reused 0 (delta 0), pack-reused 30907
Receiving objects: 100% (30938/30938), 32.69 MiB | 153.00 KiB/s, done.
Resolving deltas: 100% (14922/14922), done.
Checking out files: 100% (16114/16114), done.
[root@host131 local]#

Step 4:生成kubernetes-ansible设定文件

按照构成说明中的4台机器构成,设定inventory文件

[root@host131 inventory]# pwd
/local/contrib/ansible/inventory
[root@host131 inventory]# ll
total 4
drwxr-xr-x. 2 root root  20 Aug 29 20:06 group_vars
-rw-r--r--. 1 root root 132 Aug 29 20:06 localhost.ini
[root@host131 inventory]# cp localhost.ini inventory
[root@host131 inventory]# vi inventory
[root@host131 inventory]# cat inventory
[masters]
host131

[nodes]
host132
host133
host134

[etcd]
host131
[root@host131 inventory]#

设定inventory/group_vars/all.yml,将kube-ui打开,从default的false该为true
85 # Turn to false to disable the kube-ui addon for this cluster
86 kube-ui: false

Step 6:安装所需package

依赖关系整理的真不错,只有一个package在github的说明中虽然没有提到,但是实际是需要提前安装的

Nopackage机器安装命令
1python-netaddr192.168.32.131yum -y install python-netaddr

Step 7:执行安装文件

执行安装文件deploy-cluster.sh

[root@host131 ansible]# pwd
/local/contrib/ansible
[root@host131 ansible]# cd scripts/ && ./deploy-cluster.sh

Step 8:确认kubernetes

确认node
确认services
确认版本

[root@host131 scripts]# kubectl version
Client Version: version.Info{Major:"1", Minor:"2", GitVersion:"v1.2.0", GitCommit:"ec7364b6e3b155e78086018aa644057edbe196e5", GitTreeState:"clean"}
Server Version: version.Info{Major:"1", Minor:"2", GitVersion:"v1.2.0", GitCommit:"ec7364b6e3b155e78086018aa644057edbe196e5", GitTreeState:"clean"}
[root@host131 scripts]#
[root@host131 scripts]# kubectl get nodes
NAME      STATUS    AGE
host132   Ready     2m
host133   Ready     2m
host134   Ready     2m
[root@host131 scripts]# kubectl get service
NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   10.254.0.1   <none>        443/TCP   12m
[root@host131 scripts]#

Hello world示例

事前准备

因为pod在创建的时候会用到一个helper的镜像,以前叫pause-amd64,在k8s1.2之后都是叫做pause,因为它需要从gcr.io下载,所以大部分用户都无法下载,所以pod的状态会一直是ContainerCreating。我把这个放到一个docker用户都可以访问的地方,你也可以使用各种方法,只要取到对应的版本,将其部署到各个节点即可。在本文示例中,如下操作将在4个node都同样作一下。

[root@host131 ~]# docker search liumiaocn
INDEX       NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/liumiaocn/pause-amd64   gcr.io/google_containers/pause:2.0: Kubern...   0                    [OK]
[root@host131 ~]# docker pull docker.io/liumiaocn/pause-amd64
Using default tag: latest
Trying to pull repository docker.io/liumiaocn/pause-amd64 ...
latest: Pulling from docker.io/liumiaocn/pause-amd64
8f216013977d: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:51dbbd8636156e778a30c9eaf481b6e751552aac4fc654795d58cdbfb516d25e
Status: Downloaded newer image for docker.io/liumiaocn/pause-amd64:latest
[root@host131 ~]# docker tag docker.io/liumiaocn/pause-amd64 gcr.io/google_containers/pause:2.0
[root@host131 ~]# docker images |grep 2.0
gcr.io/google_containers/pause    2.0                 c5147e5f6708        Less than a second ago   350.2 kB
[root@host131 ~]#

创建一个deployment

以前的RC现在逐渐会被deployment所替代,但是yml写法基本没有变法,不过cli的方式下有了明显的变化。用如下的命令创建一个运行起2个实例的redmine,端口为80。为了提高速度,可以事前在node的各节点将redmine的镜像提前pull下来。

kubectl run redminemgnt --image=redmine --replicas=2 --port=80

确认结果

[root@host131 ~]# kubectl run redminemgnt --image=redmine --replicas=2 --port=80
deployment "redminemgnt" created
[root@host131 ~]# kubectl get pods
NAME                          READY     STATUS    RESTARTS   AGE
redminemgnt-298222028-85fi9   1/1       Running   0          3m
redminemgnt-298222028-tfqi2   1/1       Running   0          3m
[root@host131 ~]# kubectl get deployment
NAME          DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
redminemgnt   2         2         2            2           4m
[root@host131 ~]#

expose对外的port

export对外的port,以使得其他机器可以访问

[root@host131 ~]# kubectl expose deployment redminemgnt --port=80 --type=LoadBalancer
service "redminemgnt" exposed
[root@host131 ~]#

确认2个实例如何启动在3个node上

通过如下可以看到,当我们把2个redmine的实例启动在3个node上的时候,k8s自动的进行的分配到了host133和host134,关于分配策略可以自己通过调整scale进行实验确认以加深理解。

[root@host131 ~]# kubectl get pods -o wide
NAME                          READY     STATUS    RESTARTS   AGE       NODE
redminemgnt-298222028-85fi9   1/1       Running   0          10m       host134
redminemgnt-298222028-tfqi2   1/1       Running   0          10m       host133
[root@host131 ~]#

确认deploy

[root@host131 ~]# kubectl describe deployment redminemgnt
Name:                   redminemgnt
Namespace:              default
CreationTimestamp:      Tue, 30 Aug 2016 00:10:46 -0400
Labels:                 run=redminemgnt
Selector:               run=redminemgnt
Replicas:               2 updated | 2 total | 2 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  1 max unavailable, 1 max surge
OldReplicaSets:         <none>
NewReplicaSet:          redminemgnt-298222028 (2/2 replicas created)
Events:
  FirstSeen     LastSeen        Count   From                            SubobjectPath   Type            Reason                  Message
  ---------     --------        -----   ----                            -------------   --------        ------                  -------
  13m           13m             1       {deployment-controller }                        Normal          ScalingReplicaSet       Scaled up replica set redminemgnt-298222028 to 2


[root@host131 ~]#

确认pod

describe命令把各个组成部分清晰的列出来,所以对我们加深理解有很好的作用

[root@host131 ~]# kubectl describe pod redminemgnt-298222028-85fi9
Name:           redminemgnt-298222028-85fi9
Namespace:      default
Node:           host134/192.168.32.134
Start Time:     Tue, 30 Aug 2016 00:10:47 -0400
Labels:         pod-template-hash=298222028,run=redminemgnt
Status:         Running
IP:             172.16.64.4
Controllers:    ReplicaSet/redminemgnt-298222028
Containers:
  redminemgnt:
    Container ID:       docker://61e5320fc6877707c9cabeed8a272a41515d2a4ccf63f137d2eff760741e3865
    Image:              redmine
    Image ID:           docker://sha256:55ccd586ad119ceeb784ac924a15dd1060fa935beced3ce32e74967a0bc0ffac
    Port:               80/TCP
    QoS Tier:
      cpu:              BestEffort
      memory:           BestEffort
    State:              Running
      Started:          Tue, 30 Aug 2016 00:11:56 -0400
    Ready:              True
    Restart Count:      0
    Environment Variables:
Conditions:
  Type          Status
  Ready         True
Volumes:
  default-token-8209b:
    Type:       Secret (a volume populated by a Secret)
    SecretName: default-token-8209b
Events:
  FirstSeen     LastSeen        Count   From                    SubobjectPath                   Type            Reason          Message
  ---------     --------        -----   ----                    -------------                   --------        ------          -------
  13m           13m             1       {default-scheduler }                                    Normal          Scheduled       Successfully assigned redminemgnt-298222028-85fi9 to host134
  12m           12m             1       {kubelet host134}       spec.containers{redminemgnt}    Normal          Pulling         pulling image "redmine"
  12m           12m             1       {kubelet host134}       spec.containers{redminemgnt}    Normal          Pulled          Successfully pulled image "redmine"
  12m           12m             1       {kubelet host134}       spec.containers{redminemgnt}    Normal          Created         Created container with docker id 61e5320fc687
  12m           12m             1       {kubelet host134}       spec.containers{redminemgnt}    Normal          Started         Started container with docker id 61e5320fc687


[root@host131 ~]#

这样第一个简单的kubernetes的Helloworld就完成了,接下我们会更加详细的学习k8s的其他基础知识。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐