上一篇已经介绍过docker的单机安装,然后单机安装1是没有高可用,2是每次上去手工创建docker实例,建多了之后都不记得哪个打哪个,管理不方便。

于是又诞生了各种专门为了管理docker的创建、调度、销毁的平台,其中kerbernetes是比较主流的解决方案。(简称k8s)


实验环境:

操作系统:CentOS7

kerbernetes集群:实验中kerbernetes管理节点是单机部署,没有按照集群部署

节点IP地址
master10.1.30.34
etcd10.1.30.34
镜像仓库10.1.30.34:5000
node0110.1.30.35
node0210.1.30.36


1、环境准备:

1.1关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

1.2关闭selinux

setenforce 0
vi /etc/selinux/config
SELINUX=disabled

1.3配置yum源与安装扩展yum

使用阿里云的yum源,配置略,参考【实践演练】Linux操作系统04-配置yum源https://blog.51cto.com/14423403/2416049

1.4修改hostname

修改hostname

vi /etc/hostname

#每台修改为自己对应的名字;

10.1.30.34输入master

10.1.30.35输入node01

10.1.30.36输入node02

另外需要输入hostname 直接修改hostname,然后重启机器生效

1.5修改hosts表

3台都需要修改

vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain
10.1.30.34 master
10.1.30.34 etcd
10.1.30.35 node01
10.1.30.36 node02

1.6配置免密登录

ssh-keygen

  //一路回车默认即可

ssh-copy-id {其他机器的ip}

远程其他机器的时候,提示Are you sure you want to continue connecting (yes/no)?

按yes继续,然后提示输入目标主机的密码。

然后ssh 其他机器IP测试,如果没有提示输入密码即可远程登录,操作完成。


2、Master安装:

以下2.X内容,只需要在Master(10.1.30.34节点安装),Node不需要。

2.1安装etcd服务

yum install etcd -y

配置etcd

vi /etc/etcd/etcd.conf
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://10.1.30.34:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://10.1.30.34:2379"

运行etcd

systemctl start etcd
systemctl enable etcd

配置etcd内网信息

etcdctl set /k8s/network/config '{"Network": "173.16.0.0/16"}'

#此网段用于后续通过yaml创建docker实例时,给多个pod组成的Service Cluster分配IP地址使用。并且配置需要与后面flannel保持一致,才能正常与node通信给分配地址。

#注意173.16.0.0/16这个可以随便改,但是要用16位的,24位的会有问题。


2.2安装kurbernets master

yum install kubernetes-master -y

配置API Server

vi /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_ETCD_SERVERS="--etcd-servers=http://10.1.30.34:2379" 
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=173.16.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota"

#注意需要去掉KUBE_ADMISSION_CONTROL默认的中的SecurityContextDenyServiceAccount,与权限配置相关,实验不需要。

#--service-cluster-ip-range需要与etcd设置的内网网段一致

配置全局文件

vi /etc/kubernetes/config
KUBE_MASTER="--master=http://10.1.30.34:8080"

启动服务,并且服务设置开机启动

systemctl enable kube-apiserver kube-scheduler kube-controller-manager 
systemctl restart kube-apiserver kube-scheduler kube-controller-manager

验证测试:

网页访问http://10.1.30.34:8080/,有返回则正常。

001.png

3、Node安装:

以下3.X内容,除非特殊说明,否则仅需在Node节点安装,Master无需安装。

3.1安装docker(master、node都需要安装

yum install docker -y
systemctl start docker

拉取小镜像测试

docker run busybox echo "Hello world"

3.2安装flannelmaster、node都需要安装

#flannel用于kurbernets master与node,node与node之间的内部通信,kurbernets本身不提供该项功能,同类的还有calico,需要额外安装。

yum install flannel -y
配置flannel
vi /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://10.1.30.34:2379" 
FLANNEL_ETCD_PREFIX="/k8s/network"

#注意/k8s/network与之前etcd配置保持一致

3.3安装kubernetes node

yum install kubernetes-node -y

编辑全局配置文件

vi /etc/kubernetes/config
KUBE_MASTER="--master=http://10.1.30.34:8080"

编辑kubelet组件

#此组件很重要,配置错误yaml经常无法正常创建docker

vi /etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0"

#对所有接口开放,使master能够登录node查看pod信息;该参数默认为127.0.0.1

KUBELET_PORT="--port=10250"
KUBELET_HOSTNAME="--hostname-override=node01"

#node01、02按实际修改 

KUBELET_API_SERVER="--api-servers=http://10.1.30.34:8080"

# pod infrastructure container

KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

#修改根镜像下载地址,默认为registry.access.redhat.com/rhel7/pod-infrastructure:latest,yaml后面创建docker,kubectl get pod后面,pod一直卡在ContainerCreating不变为running,会有个报错。也可以修改为私有镜像仓库,参见“下一篇k8s私有镜像仓库的搭建”,可以修改为registry:5000/ pod-infrastructure:latest",那么所有镜像就能从registry那边pull与push了

# Add your own!

KUBELET_ARGS="--cluster_dns=173.16.0.100 --cluster_domain=cluster.local"

 #添加DNS配置项,173.16.0.100的地址,在etcd配置的网段里面,随便选择一个IP地址都可以,注意一定要是etcd配置的地址段

修改dns解析配置(注意只有这一步master也需要修改

vi /etc/resolv.conf

将内部信息改为(追加)

search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 173.16.0.100

启动服务与设置开机启动

systemctl enable kubelet kube-proxy 
systemctl restart kubelet kube-proxy

每次修改配置后的配置重载与服务重启(必须daemon-reload重载,修改才生效)

systemctl daemon-reload
systemctl restart kubelet kube-proxy

Node整体服务开启

systemctl restart flanneld
systemctl daemon-reload
systemctl restart docker
systemctl restart kubelet kube-proxy
iptables -P FORWARD ACCEPT

#不加node与master的通信会有问题


4、创建实例:

在master运行

kubectl get node

返回节点ready,表示节点已正常。

002.png

kubectl get pod表示no resource,表示还未有创建实例。

003.png

在master上配置rcyaml文件与svcyaml文件,用于在node创建docker实例。使用tomcat进行测试。

vi myweb-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
  replicas: 2
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
        - name: myweb
          image: tomcat
          ports:
          - containerPort: 8080
          env:
            - name: MYSQL_SERVICE_HOST
              value: 'mysql'
            - name: MYSQL_SERVICE_PORT
              value: '3306'

#其中replicas: 2表示2个pod,相当于2个副本

image: tomcat,这里可以修改不同的镜像源/tomcat,注意本篇文章的各种配置参数,适用于直接写image: tomcat,不要加其他前缀

后面说完如何创建私有仓库后,改为image: registry:5000/tomcat,但是需要先创建私有镜像仓库。


编辑svc文件

vi myweb-svc.yaml
apiVersion: v1
kind: Service
metadata: 
  name: myweb
spec:
  type: NodePort
  ports:
    - port: 8080
      name: myweb-svc
      nodePort: 30001
  selector:
    app: myweb

创建pod与svc

kubectl create -f myweb-rc.yaml
kubectl create -f myweb-svc.yaml

#删除可以将create改为delete

查看结果

kubectl get pod
kubectl get svc

004.png

测试docker实例是否可用

可以直接访问node:30001端口进行测试,看是否正常返回tomcat页面。

如10.1.30.35:30001

005.png

5、排错:

如果发现pod一直卡在ContainerCreating,没有变为running

到node上面运行如下命令查看日志

journalctl -u kubelet -f

发现报错

 ErrImagePull; Skipping pod "myweb-d73gs_default(b120badd-9df6-11e9-92af-0050569ba5d7)": 
 image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, 
 this may be because there are no credentials on this request.  
 details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory

发现各个node节点无法从红帽源pull取dokcer镜像。

解决方法:每个node节点都需要,Master不需要

yum install *rhsm*

然后执行

wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm

然后执行

rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem

然后执行

docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest

回到master,删除myweb-rc,重新创建myweb-rc

kubectl delete -f myweb-rc.yaml
kubectl create -f myweb-rc.yaml


等待一会儿,重新kubectl get pod

NAME          READY     STATUS    RESTARTS   AGE
myweb-j916d      1/1       Running     0       47m
myweb-m962p      1/1       Running     0       47m

pod正常运行,变为running状态。

kubectl get svc
NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes      173.16.0.1      <none>       443/TCP          6h
myweb         173.16.133.17    <nodes>      8080:30001/TCP       5h

重新访问10.1.30.35:30001测试。