337 lines
8.6 KiB
Markdown
337 lines
8.6 KiB
Markdown
<h1><center>利用kubernetes部署网站项目</center></h1>
|
||
|
||
著作:行癫 <盗版必究>
|
||
|
||
------
|
||
|
||
## 一:环境准备
|
||
|
||
#### 1.kubernetes集群
|
||
|
||
集群正常运行,例如使用以下命令检查
|
||
|
||
```shell
|
||
[root@master ~]# kubectl get node
|
||
NAME STATUS ROLES AGE VERSION
|
||
master Ready control-plane,master 5d19h v1.23.1
|
||
node-1 Ready <none> 5d19h v1.23.1
|
||
node-2 Ready <none> 5d19h v1.23.1
|
||
node-3 Ready <none> 5d19h v1.23.1
|
||
```
|
||
|
||
#### 2.harbor私有仓库
|
||
|
||
主要给kubernetes集群提供镜像服务
|
||
|
||
<img src="https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220502184026483.png" alt="image-20220502184026483" style="zoom:50%;" />
|
||
|
||
## 二:项目部署
|
||
|
||
#### 1.镜像构建
|
||
|
||
软件下载地址:
|
||
|
||
```shell
|
||
wget https://nginx.org/download/nginx-1.20.2.tar.gz
|
||
```
|
||
|
||
项目包下载地址:
|
||
|
||
```shell
|
||
git clone https://github.com/blackmed/xingdian-project.git
|
||
```
|
||
|
||
构建centos基础镜像Dockerfile文件:
|
||
|
||
```shell
|
||
root@nfs-harbor ~]# cat Dockerfile
|
||
FROM daocloud.io/centos:7
|
||
MAINTAINER "xingdianvip@gmail.com"
|
||
ENV container docker
|
||
RUN yum -y swap -- remove fakesystemd -- install systemd systemd-libs
|
||
RUN yum -y update; yum clean all; \
|
||
(cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
|
||
rm -f /lib/systemd/system/multi-user.target.wants/*;\
|
||
rm -f /etc/systemd/system/*.wants/*;\
|
||
rm -f /lib/systemd/system/local-fs.target.wants/*; \
|
||
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
|
||
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
|
||
rm -f /lib/systemd/system/basic.target.wants/*;\
|
||
rm -f /lib/systemd/system/anaconda.target.wants/*;
|
||
VOLUME [ "/sys/fs/cgroup" ]
|
||
CMD ["/usr/sbin/init"]
|
||
root@nfs-harbor ~]# docker bulid -t xingdian .
|
||
```
|
||
|
||
构建项目镜像:
|
||
|
||
```shell
|
||
[root@nfs-harbor nginx]# cat Dockerfile
|
||
FROM xingdian
|
||
ADD nginx-1.20.2.tar.gz /usr/local
|
||
RUN rm -rf /etc/yum.repos.d/*
|
||
COPY CentOS-Base.repo /etc/yum.repos.d/
|
||
COPY epel.repo /etc/yum.repos.d/
|
||
RUN yum clean all && yum makecache fast
|
||
RUN yum -y install gcc gcc-c++ openssl openssl-devel pcre-devel zlib-devel make
|
||
WORKDIR /usr/local/nginx-1.20.2
|
||
RUN ./configure --prefix=/usr/local/nginx
|
||
RUN make && make install
|
||
WORKDIR /usr/local/nginx
|
||
ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/nginx/sbin
|
||
EXPOSE 80
|
||
RUN rm -rf /usr/local/nginx/conf/nginx.conf
|
||
COPY nginx.conf /usr/local/nginx/conf/
|
||
RUN mkdir /dist
|
||
CMD ["nginx", "-g", "daemon off;"]
|
||
[root@nfs-harbor nginx]# docker build -t nginx:v2 .
|
||
```
|
||
|
||
注意:
|
||
|
||
需要事先准备好Centos的Base仓库和epel仓库
|
||
|
||
#### 2.上传项目到harbor
|
||
|
||
修改镜像tag:
|
||
|
||
```shell
|
||
[root@nfs-harbor ~]# docker tag nginx:v2 10.0.0.230/xingdian/nginx:v2
|
||
```
|
||
|
||
登录私有仓库:
|
||
|
||
```shell
|
||
[root@nfs-harbor ~]# docker login 10.0.0.230
|
||
Username: xingdian
|
||
Password:
|
||
```
|
||
|
||
上传镜像:
|
||
|
||
```shell
|
||
[root@nfs-harbor ~]# docker push 10.0.0.230/xingdian/nginx:v2
|
||
```
|
||
|
||
注意:
|
||
|
||
默认上传时采用https,因为我们部署的harbor使用的是http,所以再上传之前按照3-1进行修改
|
||
|
||
#### 3.kubernetes集群连接harbor
|
||
|
||
修改所有kubernetes集群能够访问http仓库,默认访问的是https
|
||
|
||
```shell
|
||
[root@master ~]# vim /etc/systemd/system/multi-user.target.wants/docker.service
|
||
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 10.0.1.13 --containerd=/run/containerd/containerd.sock
|
||
[root@master ~]# systemctl daemon-reload
|
||
[root@master ~]# systemctl restart docker
|
||
```
|
||
|
||
kubernetes集群创建secret用于连接harbor
|
||
|
||
```shell
|
||
[root@master ~]# kubectl create secret docker-registry regcred --docker-server=10.0.0.230 --docker-username=diange --docker-password=QianFeng@123
|
||
[root@master ~]# kubectl get secret
|
||
NAME TYPE DATA AGE
|
||
regcred kubernetes.io/dockerconfigjson 1 19h
|
||
```
|
||
|
||
注意:
|
||
|
||
regcred:secret的名字
|
||
|
||
--docker-server:指定服务器的地址
|
||
|
||
--docker-username:指定harbor的用户
|
||
|
||
--docker-password:指定harbor的密码
|
||
|
||
#### 4.部署NFS
|
||
|
||
部署NFS目的是为了给kubernetes集群提供持久化存储,kubernetes集群也要安装nfs-utils目的是为了支持nfs文件系统
|
||
|
||
```shell
|
||
[root@nfs-harbor ~]# yum -y install nfs-utils
|
||
[root@nfs-harbor ~]# systemctl start nfs
|
||
[root@nfs-harbor ~]# systemctl enable nfs
|
||
```
|
||
|
||
创建共享目录并对外共享
|
||
|
||
```shell
|
||
[root@nfs-harbor ~]# mkdir /kubernetes-1
|
||
[root@nfs-harbor ~]# cat /etc/exports
|
||
/kubernetes-1 *(rw,no_root_squash,sync)
|
||
[root@nfs-harbor ~]# exportfs -rv
|
||
```
|
||
|
||
项目放入共享目录下
|
||
|
||
```shell
|
||
[root@nfs-harbor ~]# git clone https://github.com/blackmed/xingdian-project.git
|
||
[root@nfs-harbor ~]# unzip dist.zip
|
||
[root@nfs-harbor ~]# cp -r dist/* /kubernetes-1
|
||
```
|
||
|
||
#### 5.创建statefulset部署项目
|
||
|
||
该yaml文件中除了statefulset以外还有service、PersistentVolume、StorageClass
|
||
|
||
```shell
|
||
[root@master xingdian]# cat Statefulset.yaml
|
||
apiVersion: v1
|
||
kind: Service
|
||
metadata:
|
||
name: nginx
|
||
labels:
|
||
app: nginx
|
||
spec:
|
||
type: NodePort
|
||
ports:
|
||
- port: 80
|
||
name: web
|
||
targetPort: 80
|
||
nodePort: 30010
|
||
selector:
|
||
app: nginx
|
||
---
|
||
apiVersion: storage.k8s.io/v1
|
||
kind: StorageClass
|
||
metadata:
|
||
name: xingdian
|
||
provisioner: example.com/external-nfs
|
||
parameters:
|
||
server: 10.0.0.230
|
||
path: /kubernetes-1
|
||
readOnly: "false"
|
||
---
|
||
apiVersion: v1
|
||
kind: PersistentVolume
|
||
metadata:
|
||
name: xingdian-1
|
||
spec:
|
||
capacity:
|
||
storage: 1Gi
|
||
volumeMode: Filesystem
|
||
accessModes:
|
||
- ReadWriteOnce
|
||
storageClassName: xingdian
|
||
nfs:
|
||
path: /kubernetes-1
|
||
server: 10.0.0.230
|
||
---
|
||
apiVersion: v1
|
||
kind: PersistentVolume
|
||
metadata:
|
||
name: xingdian-2
|
||
spec:
|
||
capacity:
|
||
storage: 1Gi
|
||
volumeMode: Filesystem
|
||
accessModes:
|
||
- ReadWriteOnce
|
||
storageClassName: xingdian
|
||
nfs:
|
||
path: /kubernetes-1
|
||
server: 10.0.0.230
|
||
---
|
||
apiVersion: apps/v1
|
||
kind: StatefulSet
|
||
metadata:
|
||
name: web
|
||
spec:
|
||
selector:
|
||
matchLabels:
|
||
app: nginx
|
||
serviceName: "nginx"
|
||
replicas: 2
|
||
template:
|
||
metadata:
|
||
labels:
|
||
app: nginx
|
||
spec:
|
||
terminationGracePeriodSeconds: 10
|
||
containers:
|
||
- name: nginx
|
||
image: 10.0.0.230/xingdian/nginx:v2
|
||
ports:
|
||
- containerPort: 80
|
||
name: web
|
||
volumeMounts:
|
||
- name: www
|
||
mountPath: /dist
|
||
volumeClaimTemplates:
|
||
- metadata:
|
||
name: www
|
||
spec:
|
||
accessModes: [ "ReadWriteOnce" ]
|
||
storageClassName: "xingdian"
|
||
resources:
|
||
requests:
|
||
storage: 1Gi
|
||
```
|
||
|
||
#### 6.运行
|
||
|
||
```shell
|
||
[root@master xingdian]# kubectl create -f Statefulset.yaml
|
||
service/nginx created
|
||
storageclass.storage.k8s.io/xingdian created
|
||
persistentvolume/xingdian-1 created
|
||
persistentvolume/xingdian-2 created
|
||
statefulset.apps/web created
|
||
```
|
||
|
||
## 三:项目验证
|
||
|
||
#### 1.pv验证
|
||
|
||
```shell
|
||
[root@master xingdian]# kubectl get pv
|
||
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
|
||
xingdian-1 1Gi RWO Retain Bound default/www-web-1 xingdian 9m59s
|
||
xingdian-2 1Gi RWO Retain Bound default/www-web-0 xingdian 9m59s
|
||
```
|
||
|
||
#### 2.pvc验证
|
||
|
||
```shell
|
||
[root@master xingdian]# kubectl get pvc
|
||
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
|
||
www-web-0 Bound xingdian-2 1Gi RWO xingdian 10m
|
||
www-web-1 Bound xingdian-1 1Gi RWO xingdian 10m
|
||
```
|
||
|
||
#### 3.storageClass验证
|
||
|
||
```shell
|
||
[root@master xingdian]# kubectl get storageclass
|
||
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
|
||
xingdian example.com/external-nfs Delete Immediate false 10m
|
||
```
|
||
|
||
#### 4.statefulset验证
|
||
|
||
```shell
|
||
[root@master xingdian]# kubectl get statefulset
|
||
NAME READY AGE
|
||
web 2/2 13m
|
||
[root@master xingdian]# kubectl get pod
|
||
NAME READY STATUS RESTARTS AGE
|
||
web-0 1/1 Running 0 13m
|
||
web-1 1/1 Running 0 13m
|
||
```
|
||
|
||
#### 5.service验证
|
||
|
||
```shell
|
||
[root@master xingdian]# kubectl get svc
|
||
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
|
||
nginx NodePort 10.111.189.32 <none> 80:30010/TCP 13m
|
||
```
|
||
|
||
#### 6.浏览器访问
|
||
|
||
<img src="https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220502193031689.png" alt="image-20220502193031689" style="zoom:80%;" />
|