深入学习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