实验环境
VSphere虚拟化环境 centos7.9操作系统1U1核4G内存50G硬盘
k8s版本:Kubernetes v1.5.2
mysql版本:mysql:5.7.18
centos7.9操作系统的安装
在VSphere虚拟化环境下新建虚拟机,相应设置如下
1U1核4G内存50G硬盘
打开虚拟机,连接centos7.9镜像,开始安装
选择安装方式(个人习惯),个人建议最好安装上开发工具包(未测试对k8s有无影响只是单纯吃过没装开发工具后续要用到的亏)
设置静态网络,可以访问Internet。(安装k8s为yum安装直接使用网络yum源,DNS我取用常见114.114.114.114,也可以使用8.8.8.8;网关必须配置。)
以上设置完成后即可开始安装了,安装完成测试网络是否可以访问Internet;
网络访问正常,下面我们就准备开始安装k8s。如无法访问网络,检查相应IP设置,和网关路由设置是否满足虚拟机访问网络。
k8s单机版部署
关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
关闭SELinux:
setenforce 0
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
关闭swap :
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
更新yum源:
yum clean all&&yum update
配置kubenetes
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[Kubernetes]
name=kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装etcd 和kubernetes以下操作会自动安装docker
yum install -y etcd kubernetes
安装成功后修改两个配置文件docker和apiserver
Docker配置文件 /etc/sysconfig/docker,其中的OPTIONS的内容设置为:
$ vim /etc/sysconfig/docker
OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'
Kubernetes修改apiserver的配置文件,在/etc/kubernetes/apiserver中
$ vim /etc/kubernetes/apiserver
KUBE_ADMISSION_CONTROL="--admission_control=NamespaceLifecycle,NamespaceExists,
LimitRanger,SecurityContextDeny,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
按照顺序启动服务
systemctl start etcd
systemctl start docker
systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
systemctl start kubelet
systemctl start kube-proxy
#设置开机启动
systemctl enable etcd
systemctl enable docker
systemctl enable kube-apiserver
systemctl enable kube-controller-manager
systemctl enable kube-scheduler
systemctl enable kubelet
systemctl enable kube-proxy
验证安装成功
[root@k8s ~]# ps -ef | grep kube
kube 8579 1 0 07:24 ? 00:00:06 /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,ServiceAccount,ResourceQuota
kube 8596 1 1 07:25 ? 00:00:11 /usr/bin/kube-controller-manager --logtostderr=true --v=0 --master=http://127.0.0.1:8080
kube 8622 1 0 07:25 ? 00:00:01 /usr/bin/kube-scheduler --logtostderr=true --v=0 --master=http://127.0.0.1:8080
root 8641 1 1 07:25 ? 00:00:17 /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 8717 1 1 07:25 ? 00:00:08 /usr/bin/kube-proxy --logtostderr=true --v=0 --master=http://127.0.0.1:8080
root 18353 8168 0 07:40 pts/0 00:00:00 grep --color=auto kube
[root@k8s ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"269f928217957e7126dc87e6adfa82242bfe5b1e", GitTreeState:"clean", BuildDate:"2017-07-03T15:31:10Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"269f928217957e7126dc87e6adfa82242bfe5b1e", GitTreeState:"clean", BuildDate:"2017-07-03T15:31:10Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"}
[root@k8s ~]# etcdctl cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://localhost:2379
cluster is healthy
安装k8s单机版成功,下面部署mysql容器
k8s-mysql部署
创建mysql容器
1.拉取mysql服务镜像
[root@k8s ~]# sudo docker pull mysql
或
[root@k8s ~]# docker pull hub.c.163.com/library/mysql:latest
2.创建rc定义文件mysql-rc.yaml(mysql的一些基本信息)
[root@k8s k8s]# vi mysql-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: mysql
spec:
replicas: 1
selector:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: hub.c.163.com/library/mysql
ports:
- containerPort: 3306 #容器mysql的端口号
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456" #mysql的root密码
#文件内容来源:https://blog.csdn.net/jcmj123456/article/details/116504294,
使用编写的rc文件创建容器mysql
[root@k8s ~]# kubectl create -f mysql-rc.yaml #-f 参数后跟绝对路径指定到文件所在
查看是否创建容器mysql成功:
[root@k8s ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-bgff2 0/1 ContainerCreating 0 17s
检查创建中遇到的问题:
[root@k8s ~]# kubectl describe pod mysql-bgff2
ailedSync Error syncing pod, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image \"registry.access.redhat.com/rhel7/pod-infrastructure:latest\""
51s 11s 3 {kubelet 127.0.0.1} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "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)"
#遇到上述报错即缺少redhat-uep.pem文件,上传相应文件到对应目录即可(/etc/rhsm/ca/redhat-uep.pem)
找了好多资源,找的下载包,分享在我的网盘里链接:
https://pan.baidu.com/s/1hxxD2q9j-3doEj6o67goSg?pwd=s15g
解决上述问题后,删除容器mysql重新创建:
[root@k8s ~]# kubectl delete -f mysql-rc.yaml
replicationcontroller "mysql" deleted
[root@k8s ~]# kubectl create -f mysql-rc.yaml
replicationcontroller "mysql" created
[root@k8s k8s]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-17v77 1/1 Running 0 12m
状态为Running即为正常运行,表示k8s-mysql创建成功。
创建与之关联的k8s服务 mysql-svc.yaml
[root@k8s k8s]# vi mysql-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
#文件内容来源:https://blog.csdn.net/jcmj123456/article/details/116504294
执行创建服务命令,并查看创建的服务
[root@k8s k8s]# kubectl create -f mysql-svc.yaml
service "mysql" created
[root@k8s k8s]# kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> 443/TCP 59m
mysql 10.254.68.114 <none> 3306/TCP 28s
总结,这部分创建服务和mysql的yaml文件属于非持久化的mysql。即崩溃数据就消失。作为练手学习可以,非生产环境。