深入学习Kubernetes(一):单节点k8s安装

 扩容和升级需要一个关键的东西,Replication controller(RC),RC需要包含3个关键信息:

1)目标pod的定义
2)目标pod需要运行的副本数量(replicas)
3)要监控的目标pod的标签(Label)
工作过程:RC里定义好3个指标,kubernetes会根据RC定义的Label帅选出对应的pod,并实时监控其状态和数量,当实例数量
少于定义的副本数(replicas),则会根据RC定义的pod模版来创建新的pod,然后将此pod调度到合适的Node上启动并运行。
该过程完全自动化,无需人工干涉。
从一个例子开始:
webapp + mysql

一、服务器环境设置及规划

1.1 服务器运行环境及ip

运行节点:192.168.0.110  node1  CentOS 7.5.1804  3.10.0-862.3.2.el7.x86_64

1.2 关闭selinux和firewalld

关闭selinux:
# setenforce 0  临时关闭
# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config 重启后永久生效
关闭防火墙:
#systemctl stop firewalld 停用防火墙服务
#systemctl disable firewalld
# yum install -y iptables-services 装这个包,就可用centos6版本的防火墙
# systemctl enable iptables
# systemctl start iptables
# iptables -F  清除规则
# service iptables save 保存规则

1.3 更换yum源

#备份
# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
#下载新的CentOS-Base.repo到 /etc/yum.repos.d
#wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#yum makecache
  • 为了让国内下载etcd和kubernetes更流畅,我们先切换阿里云的yum源

二、安装和配置k8s

2.1 安装etcd和kubernetes(安装过程中会自动安装Docker软件)

#yum install -y etcd kubernetes

2.2 配置修改

安装完成后,需要修改相关配置

2.2.1 修改Docker配置文件 其中的OPTIONS的内容设置为:

#vim /etc/sysconfig/docker
#OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'

2.2.2 修改Kubernetes的apiserver配置文件

#vim /etc/kubernetes/apiserver
KUBE_ADMISSION_CONTROL="--admission_control=NamespaceLifecycle,NamespaceExists,
 LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"

 去掉 ServiceAccount 选项。否则会在往后的pod创建中,会出现类似以下的错误:

Error from server: error when creating "mysql-rc.yaml": Pod "mysql" is forbidden:
 no API token found for service account default/default, 
 retry after the token is automatically created and added to the service account

2.3 配置docker加速器

#vi /etc/docker/daemon.json
#加入如下内容:
{
  "registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"]
}

2.4 按顺序启动服务

systemctl start etcd
systemctl start docker
systemctl start kube-apiserver.service
systemctl start kube-controller-manager.service
systemctl start kube-scheduler.service
systemctl start kubelet.service
systemctl start kube-proxy.service
# for s in etcd docker kube-apiserver  kube-controller-manager kube-scheduler  kubelet  kube-proxy
> do
>     systemctl start $s
> done
小脚本启动服务

2.5 检验下kubernetes的服务是否启动

# ps aux|grep kube
kube      18143  3.1 11.2 136764 54276 ?        Ssl  14:17   0:05 /usr/bin/kube-apiserver --logtostderr=true --v=0 --etcd-servers=http://127.0.0.1:2379 --insecure-bind-address=127.0.0.1 --allow-privileged=false --service-cluster-ip-range=10.254.0.0/16 --admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota
kube      18153  2.3  4.9 291908 23980 ?        Ssl  14:17   0:04 /usr/bin/kube-controller-manager --logtostderr=true --v=0 --master=http://127.0.0.1:8080
kube      18160  0.6  2.3 278968 11272 ?        Ssl  14:17   0:01 /usr/bin/kube-scheduler --logtostderr=true --v=0 --master=http://127.0.0.1:8080
root      18167  3.6  6.3 521300 30596 ?        Ssl  14:17   0:06 /usr/bin/kubelet --logtostderr=true --v=0 --api-servers=http://127.0.0.1:8080 --address=127.0.0.1 --hostname-override=127.0.0.1 --allow-privileged=false --pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest
root      18178  2.0  4.0 357184 19384 ?        Ssl  14:17   0:03 /usr/bin/kube-proxy --logtostderr=true --v=0 --master=http://127.0.0.1:8080
  • 到目前为止,一个单机版的Kubernetes的环境就安装启动完成了 

三、启动MySQL容器服务

3.1 创建mysql服务RC文件

#vim mysql-rc.yaml  
#内容如下:
apiVersion: v1
kind: ReplicationController                            #表明此资源对象的类型,例如上面表示的是一个RC,副本控制器RC
metadata:
  name: mysql                                          #RC的名称,全局唯一
spec:
  replicas: 1                                          #Pod副本的期待数量
  selector:
    app: mysql                                         #符合目标的Pod拥有此标签
  template:                                            #根据此模板创建Pod的副本(实例)
    metadata:
      labels:
        app: mysql                                     #Pod副本拥有的标签,对应RC的Selector
    spec:
      containers:                                      #Pod内 容器的定义部分
      - name: mysql                                    #容器的名称
        image: mysql:5.6                              #容器对应的Docker image
        ports: 
        - containerPort: 3306                          #容器应用监听的端口号
        env:                                           #注入容器内的环境变量
        - name: MYSQL_ROOT_PASSWORD 
          value: "123456"

3.2 创建好 mysql-rc.yaml后, 为了将它发布到Kubernetes中,我们在Master节点执行命令

# kubectl create -f mysql-rc.yaml 
replicationcontroller "mysql" created

3.3 查看创建的rc

# kubectl get rc
NAME      DESIRED   CURRENT   READY     AGE
mysql     1         1         1         12m

3.4 查看创建pod的情况

# kubectl get pods 
NAME          READY     STATUS    RESTARTS   AGE
mysql-rmpkx   1/1       Running   0          9m
#可见pod的状态处于ContainerCreating,我们需要耐心等待一下,直到状态为Running才算成功
# kubectl get pods 
NAME          READY     STATUS    RESTARTS   AGE
mysql-rmpkx   1/1       Running   0          9m
3.4.1 ContainerCreating就是下载镜像文件
# docker images
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
docker.io/mysql                                       5.6                 27e29668a08a        12 days ago         256 MB
registry.access.redhat.com/rhel7/pod-infrastructure   latest              99965fb98423        15 months ago       209 MB
3.4.2 为了快速从ContainerCreating到Running,我们可以提前下载好镜像文件
#docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
#kubernets官方的pod,必须有,没有无法继续后边操作 #docker pull mysql:5.6

3.5 创建与之关联的Kubernetes Service - MySQL的文件

# vim mysql-svc.yaml 
#加入以下内容:
apiVersion: v1                      
kind: Service                              #表明是K8s Service
metadata: 
  name: mysql                              #Service的全局唯一名称
spec:
  ports:
    - port: 3306                           #Service提供服务的端口号
  selector:                                #Service对应的Pod拥有这里定义的标签
    app: mysql
  • spec.selector确定了哪些Pod副本(实例)对应到本服务

3.6 创建刚定义好的svc

# kubectl create -f mysql-svc.yaml 
service "mysql" created

3.7 查看service的状态

# kubectl get svc
NAME         CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
kubernetes   10.254.0.1     <none>        443/TCP    1h
mysql        10.254.85.55   <none>        3306/TCP   1m
  • 注意到MySQL服务被分配到了一个值为10.254.85.55的Cluster IP地址,这是一个虚地址,随后,k8s集群中其他新创建的Pod就可以通过Service的Cluster IP+端口号3306来连接和访问它了。现在我们只需知道,根据Service的唯一名字,容器可以从环境变量中获取到Service对应的Cluster IP地址和端口,从而发起TCP/IP连接请求了。
    ]# mysql -u root -p123456 -h10.254.85.55
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MySQL connection id is 1
    Server version: 5.6.42 MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MySQL [(none)]> 
    

      

  • 到这里,MySQL容器服务就启动了。小结下创建过程,首先,拉取服务镜像,然后创建RC定义文件,再发布到k8s中,可以看到pod被创建。最后创建一个与之关联的k8s Service,也是通过.yaml文件和kubectl create命令创建。

四、启动Web容器服务

4.1创建对应的RC文件web-rc.yaml,内容如下:

# vim web-rc.yaml 
#加入以下内容:
apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
  replicas: 5                                       #Pod副本期待数量为5
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: myweb
        image: docker.io/kubeguide/tomcat-app:v1
        ports: 
        - containerPort: 8080
        env:
        - name: MYSQL_SERVICE_HOST
          value: "10.254.85.55" #这里的IP需要通过kubect get svc 查看mysql的cluster ip 
- name: MYSQL_SERVICE_PORT
value: "3306"
  • 如果安装kubernets-dns插件,name: MYSQL_SERVICE_HOST value: "10.254.85.55"  可直接写mysql,不用写IP

4.2 用kubetctl命令创建对应的rc

# kubectl create -f web-rc.yaml 
replicationcontroller "myweb" created

4.3 查看刚创建的rc

]# kubectl get rc
NAME      DESIRED   CURRENT   READY     AGE
mysql     1         1         1         1h
myweb     1         1         0         1m

4.4 查看创建的pod

#kubectl get pods
NAME          READY     STATUS              RESTARTS   AGE
mysql-rmpkx   1/1       Running             1          1h
myweb-xjb9f   0/1       ContainerCreating   0          1m
# docker images
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
docker.io/mysql                                       5.6                 27e29668a08a        12 days ago         256 MB
registry.access.redhat.com/rhel7/pod-infrastructure   latest              99965fb98423        15 months ago       209 MB
docker.io/kubeguide/tomcat-app                        v1                  a29e200a18e9        2 years ago         358 MB
# kubectl get pods
NAME          READY     STATUS    RESTARTS   AGE
mysql-rmpkx   1/1       Running   1          1h
myweb-xjb9f   1/1       Running   0          3m

4.5创建与之关联的Kubernetes Service - myweb的文件

# vi web-sve.yaml 
# 加入以下内容
apiVersion: v1
kind: Service
metadata: 
  name: myweb
spec:
  type: NodePort
  ports:
    - port: 8080
      nodePort: 30001
  selector:
    app: myweb
  • type=NodePort和nodePort=30001的两个属性,表明此Service开启了NodePort方式的外网访问模式。可以通过本地IP加30001访问,端口最小不能低于30000

4.6 用kubetctl命令创建对应的svc

# kubectl create -f web-svc.yaml 
service "myweb" created

4.7 查看svc状态

# kubectl get svc
NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   10.254.0.1       <none>        443/TCP          1h
mysql        10.254.85.55     <none>        3306/TCP         38m
myweb        10.254.215.233   <nodes>       8080:30001/TCP   7s

五、验证

浏览器访问:

可以在本机浏览器中输入http://192.168.0.110:30001/demo/来测试我们发的web应用。

需要加一条防火墙规则:

# iptables -P FORWARD ACCEPT

  

  

 

  

  


  

  

 

  

  

  

  

 

 

  

  

  

  

  

  

  

  

 

 
 
posted @ 2019-01-10 16:16  学习记事本  阅读(951)  评论(0编辑  收藏  举报