目录
- 1. 开始
- 1.1. 环境
- 1.2. 测试的git仓库
- 1.3. 离线文件
- 1.4. 安装docker
- 1.5. 安装docker-compose(非必要)
- 1.6. 安装Jenkins
- 1.7. 安装harbor
- 1.8. 允许docker通过http访问私有仓库
- 1.9. 修改/etc/hosts,追加自定义域名
- 1.10. 安装Minikube
- 2. minikube使用driver=docker方式
- 3. minikube使用driver=none方式
- 3.1. 安装minikube前提
- 3.1.1. cri-docker安装
- 3.1.2. containernetworking-plugins 安装
- 3.1.3. 安装 conntrack-tools
- 3.1.4. 安装crictl
- 3.1.5. 安装which
- 3.1.6. 安装socat
- 3.1.7. 禁用swap
- 3.2. 安装成功后
- 3.2.1. 安装时的问题
- 3.2.2. 设置别名 kubectl
- 3.2.3. 安装minikube-dashboard
- 3.2.4. 给apiservice配置代理外网访问(含minikube-dashboard)
- 4. 外部端口之间通讯
- 4.1. 使用 port-forward(临时用)
- 4.2. 使用Pod提供的外部访问端口
- 4.3. 使用 ingress提供的外部访问端口转发
- 4.3.1. 安装ingress
- 4.3.2. 例子1:
- 4.3.3. 例子2:
- 5. 内部端口之间通讯
- 5.1. Pod 不会与Pod之间通讯
- 5.2. service之间通讯
- 5.2.1. 例子
- 6. 挂载卷
- 7. 补充语句
- 8. 部署项目
- 8.1. 部署springboot项目
- 8.1.1. 流程
- 9. 术语
1. 开始
建议使用driver=none方式
1.1. 环境
系统:archlinux
k8s版本:1.30.0
1.2. 测试的git仓库
https://gitee.com/alvis128/demo.git
https://gitee.com/alvis128/demo2.git
1.3. 离线文件
链接:https://pan.baidu.com/s/1G0mhdUhd0HmphZnlva2prg
提取码:ue70
1.4. 安装docker
# 安装docker
sudo pacman -S docker
# 配置自启动服务,并立即启动docker
sudo systemctl enable --now docker
# 赋予当前用户docker权限
sudo usermod -aG docker $USER
newgrp docker
docker 配置源
/etc/docker 目录可能不存在,需要创建,所以运行命令:mkdir /etc/docker
nano /etc/docker/daemon.json
----------------------
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
]
}
---------------------
# 更新daemon
systemctl daemon-reload
# 重启docker
systemctl restart docker
# 查看docker状态
systemctl status docker
1.5. 安装docker-compose(非必要)
# 安装docker-compose
sudo pacman -S docker-compose
1.6. 安装Jenkins
默认启动端口是:8090
sudo pacman -S jenkins
# 查看启动状态
systemctl status jenkins
# 若没有启动,则运行命令启动
systemctl start jenkins
# 赋予当前用户(jenkins)docker权限
sudo usermod -aG docker jenkins
newgrp docker
额外:
jenkins切换用户执行
# 修改
nano /usr/lib/systemd/system/jenkins.service
-------------
user=tavion
-------------
chown -R tavion:tavion /usr/lib/jenkins
chown -R tavion:tavion /var/cache/jenkins
chown -R tavion:tavion /var/log/jenkins
1.7. 安装harbor
第一步、 下载并解压
github仓库:https://github.com/goharbor/harbor/releases
# 下载并解压
wget https://github.com/goharbor/harbor/releases/download/v2.11.0-rc1/harbor-offline-installer-v2.11.0-rc1.tgz
tar zxvf harbor-offline-installer-v2.11.0-rc1.tgz
# 上面解压后,会生成harbor目录,然后我们进入目录
cd harbor
第二步、配置harbor.yml
# 复制并改名
cp harbor.yml.tmpl harbor.yml
# 第二步、修改harbor.yml文件
nano harbor.yml
----------------------
# 注释https
# 修改hosthome为本地ip地址,也可以改为域名
----------------------
修改harbor.yml文件,我们测试环境不需要用https,所以注释掉,例如:
# 修改hostname
hostname: tavion.com
http:
port: 8180
# 下面注释https
# https related config
# https:
# https port for harbor, default is 443
# port: 8181
# The path of cert and key files for nginx
# certificate: /home/vagrant/harbor/secret/ca.crt
# private_key: /home/vagrant/harbor/secret/ca.key
# enable strong ssl ciphers (default: false)
# strong_ssl_ciphers: false
(后面略)
第三步、修改/etc/hosts,追加自定义域名
echo "127.0.0.1 tavion.com" >> /etc/hosts
第四步、导入harbor的images包
如果不导入,harbor会联网下载包,很慢的
docker load -i harbor.v2.11.0.tar.gz
第五步、安装harbor
./install.sh
1.8. 允许docker通过http访问私有仓库
第一种:通过修改daemon.json 方式(不推荐,因为重启后,会被其他程序修改)
# 修改/etc/docker/daemon.json ,修改结果如下:
vi /etc/docker/daemon.json
-----------------------------------------------
{
"exec-opts": [
"native.cgroupdriver=systemd"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
],
"insecure-registries": [
"http://tavion.com:8380"
]
}
-----------------------------------------------
# 刷新daemon
systemctl daemon-reload
systemctl restart docker
# 查看docker是否正常运行,没问题
systemctl status docker
第二种: 通过在docker.service启动时添加例外
# 通过查看状态,找到docker服务执行类
systemctl status docker
# 修改服务
sudo nano /usr/lib/systemd/system/docker.service
------------------------------------------
# 修改成如下,在末尾添加例外 --insecure-registry=tavion.com
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry=tavion.com
------------------------------------------
1.9. 修改/etc/hosts,追加自定义域名
前面如果运行了,这里就不用运行了
echo "127.0.0.1 tavion.com" >> /etc/hosts
1.10. 安装Minikube
打开网址:https://minikube.sigs.k8s.io/docs/start/
根据提示安装Minikube
例如linux系统安装步骤:
# 下载并安装minikube程序
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64
# 使用minikube部署k8s,安装很慢,因为网络问题,如下就是成功例子
minikube start --kubernetes-version=v1.30.0 --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --driver=docker --memory=2048mb --image-mirror-country='cn'
---------------------------------------------
* minikube v1.33.1 on Arch (vbox/amd64)
* Using the docker driver based on user configuration
* Using image repository registry.cn-hangzhou.aliyuncs.com/google_containers
* Using Docker driver with root privileges
* Starting "minikube" primary control-plane node in "minikube" cluster
* Pulling base image v0.0.44 ...
! minikube was unable to download registry.cn-hangzhou.aliyuncs.com/google_containers/kicbase:v0.0.44, but successfully downloaded docker.io/kicbase/stable:v0.0.44 as a fallback image
* Creating docker container (CPUs=2, Memory=2048MB) ...
* Preparing Kubernetes v1.30.0 on Docker 26.1.1 ...
- Generating certificates and keys ...
- Booting up control plane ...
- Configuring RBAC rules ...
* Configuring bridge CNI (Container Networking Interface) ...
* Verifying Kubernetes components...
- Using image registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner:v5
* Enabled addons: storage-provisioner, default-storageclass
* kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'
* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
---------------------------------------------
# 添加别名
alias kubectl="minikube kubectl --"
# 查看安装状态,如果安装成功,是全部都ready的,如下就是成功例子
kubectl get po -A
---------------------------------------------
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7c445c467-5g2sl 1/1 Running 1 (103s ago) 10m
kube-system etcd-minikube 1/1 Running 1 (108s ago) 11m
kube-system kube-apiserver-minikube 1/1 Running 1 (98s ago) 11m
kube-system kube-controller-manager-minikube 1/1 Running 1 (108s ago) 11m
kube-system kube-proxy-vnc94 1/1 Running 1 (108s ago) 10m
kube-system kube-scheduler-minikube 1/1 Running 1 (108s ago) 11m
kube-system storage-provisioner 1/1 Running 2 (108s ago) 11m
kubernetes-dashboard dashboard-metrics-scraper-b5fc48f67-28bf9 1/1 Running 1 (108s ago) 9m23s
kubernetes-dashboard kubernetes-dashboard-779776cb65-2nqw4 1/1 Running 2 (94s ago) 9m23s
----------------------------------------------
2. minikube使用driver=docker方式
minikube 创建一个minikube的docker(1)容器,里面也有一个docker(2),服务都在这个docker(2)里执行
有缺陷:如果要添加私有仓库,需要进入到docker(2)里修改,且重启minikube后,docker(2)的修改内容丢失,这里的修改内容指的是私有仓库。不推荐使用
这里略,不推荐使用
3. minikube使用driver=none方式
部署简单
minikube start --kubernetes-version=v1.30.0 --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --driver=none --memory=2048mb --image-mirror-country='cn'
3.1. 安装minikube前提
3.1.1. cri-docker安装
参考 https://mirantis.github.io/cri-dockerd/usage/install-manually/
- 下载二进制安装包
打开网址,下载: https://github.com/Mirantis/cri-dockerd
下载后文件:cri-dockerd-0.3.14.amd64.tgz
解压: tar zxvf cri-dockerd-0.3.14.amd64.tgz
- 本地执行
git clone -b v0.3.14 --depth 1 https://github.com/Mirantis/cri-dockerd.git
-
进入cri-dockerd目录,并把二进制安装包cri-dockerd 放到cri-dockerd目录下
-
执行
install -o root -g root -m 0755 cri-dockerd /usr/local/bin/cri-dockerd
install packaging/systemd/* /etc/systemd/system
sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
systemctl daemon-reload
systemctl enable --now cri-docker.socket
3.1.2. containernetworking-plugins 安装
参考 https://minikube.sigs.k8s.io/docs/faq/#how-do-i-install-containernetworking-plugins-for-none-driver
查看版本:
https://github.com/containernetworking/plugins/releases
v1.5.0 为例
mkdir -p /opt/cni/bin
tar -xf cni-plugins-linux-amd64-v1.5.0.tgz -C /opt/cni/bin
3.1.3. 安装 conntrack-tools
pacman -S conntrack-tools
3.1.4. 安装crictl
sudo pacman -S crictl
3.1.5. 安装which
sudo pacman -S which
3.1.6. 安装socat
pacman -S socat
3.1.7. 禁用swap
# 临时禁用
sudo swapoff -a
# 永久关闭
sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab
3.2. 安装成功后
3.2.1. 安装时的问题
minikube start --kubernetes-version=v1.30.0 --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --driver=none --memory=2048mb --image-mirror-country='cn'
这里一般都会有网络问题,如果失败,则重新安装。
# 删除后,重新安装
minikube delete
你也可以从我网盘里拿到minikube start…的离线安装文件: minikube_cache.tar.gz
你可以放置到~/.minikube
如下,然后继续minikube start…
mv minikube_cache.tar.gz ~/.minikube
tar zxvf minikube_cache.tar.gz
minikube start --kubernetes-version=v1.30.0 --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --driver=none --memory=2048mb --image-mirror-country='cn'
3.2.2. 设置别名 kubectl
# 修改/etc/profile 在最后添加如下
alias kubectl="minikube kubectl --"
# 更新
source /etc/profile
3.2.3. 安装minikube-dashboard
minikube dashboard
# 配置代理
kubectl proxy --port=45396 --address='0.0.0.0' --disable-filter=true --accept-hosts='^.*' &
# 游览器访问:
http://tavion.com:45396/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/#/ingressclass?namespace=default
3.2.4. 给apiservice配置代理外网访问(含minikube-dashboard)
# 配置代理:这里我们配置后台执行,所以后面添加&:
kubectl proxy --port=45396 --address='0.0.0.0' --disable-filter=true --accept-hosts='^.*' &
4. 外部端口之间通讯
4.1. 使用 port-forward(临时用)
# 配置映射外部端口
# 查看Pods
kubectl get pod
--------------------------------
NAME READY STATUS RESTARTS AGE
demo-79dfdd6f88-8c69f 1/1 Running 0 65m
--------------------------------
# 映射外部端口
kubectl port-forward --address 0.0.0.0 demo-79dfdd6f88-8c69f 8190:8080
# 游览器访问:
curl http://localhost:8190/version
4.2. 使用Pod提供的外部访问端口
配置自定义的外部访问端口,需要在ports里添加hostPort
外部访问端口
apiVersion: v1
kind: Pod
metadata:
name: webapp
labels:
app: webapp
spec:
# hostNetwork: true # 网络模式选择为使用宿主机网络,即容器所有的端口都会自动映射到宿主机上
containers:
- name: webapp
image: tomat
ports:
- containerPort: 8080 # 容器的运行端口为 8080
hostPort: 8081 # 映射到宿主机的端口为 8081,如果上边设置了网络模式,则不需要加 hostPort
# command: ['sh', '-c', 'echo The app is running! && sleep 3600']
minikube kubectl -- apply -f webapp-pod.yaml
4.3. 使用 ingress提供的外部访问端口转发
这种只提供80端口和443端口,内置nginx,通过nginx转发请求。如下:
4.3.1. 安装ingress
minikube addons enable ingress --images="KubeWebhookCertgenCreate=google_containers/kube-webhook-certgen:v20230407,KubeWebhookCertgenPatch=google_containers/kube-webhook-certgen:v20230407,IngressController=google_containers/nginx-ingress-controller:v1.8.1" --registries="IngressController=registry.cn-hangzhou.aliyuncs.com,KubeWebhookCertgenCreate=registry.cn-hangzhou.aliyuncs.com,KubeWebhookCertgenPatch=registry.cn-hangzhou.aliyuncs.com"
安装成功后,查看状态:
kubectl get pod -n ingress-nginx
----------------------------------
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-29nfv 0/1 Completed 0 146m
ingress-nginx-admission-patch-5dmvr 0/1 Completed 1 146m
ingress-nginx-controller-77b5c5fcc6-wpgzf 1/1 Running 0 146m
----------------------------------
4.3.2. 例子1:
kubectl get svc -n ingress-nginx -owide
demo-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-ingress
annotations:
# 指定 Ingress Controller 的类型
kubernetes.io/ingress.class: "nginx"
# 指定我们的 rules 的 path 可以使用正则表达式
nginx.ingress.kubernetes.io/use-regex: "true"
# 连接超时时间,默认为 5s
nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"
# 后端服务器回转数据超时时间,默认为 60s
nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
# 后端服务器响应超时时间,默认为 60s
nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
# 客户端上传文件,最大大小,默认为 20m
nginx.ingress.kubernetes.io/proxy-body-size: "10240m"
# URL 重写
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: demo.tavion.com # 游览器通过域名访问,不能使用ip访问,ip访问会报404 找不到资源:http://demo.tavion.com
http:
paths:
- pathType: Prefix
path: / # 匹配路径
backend:
service:
name: demo # deployment的名称
port:
number: 8080 # deployment的端口
# 加入转发配置信息到ingress
minikube kubectl -- apply -f demo-ingress.yaml
4.3.3. 例子2:
在外网可以通过www1.westos.org访问myservice服务,也可以通过www2.westos.org访问nginx-svc服务
apiVersion: networking.k8s.io/v1betal
kind: Ingress
metadata:
name: ingress-demo
spec:
rules:
- host:www1.westos.org
http:
paths:
- path: /
backend:
serviceName: myservice
servicePort: 80
- host: www2.westos.org
http:
paths:
- path: /
backend:
serviceName: nginx-svc
servicePort: 80
5. 内部端口之间通讯
k8s集群中三种IP(NodeIP、PodIP、ClusterIP)介绍
- NodeIP:Node 节点的 IP 地址,即物理机(虚拟机)的 IP 地址。
- PodIP:Pod 的 IP 地址,即 docker 容器的 IP 地址,此为虚拟 IP 地址。
- ClusterIP:k8s 虚拟的 Service 的 IP 地址,此为虚拟 IP 地址。
5.1. Pod 不会与Pod之间通讯
5.2. service之间通讯
service之间是可以通讯的。
Service种类、类型(ClusterIP、NodePort、LoadBalancer、ExternalName)
配置方法:
配置自定义的外部访问端口,需要在ports里添加nodePort
外部访问端口
apiVersion: v1
kind: Service
metadata:
name: webapp
spec:
type: NodePort # 设置 Service 类型为 NodePort
ports:
- port: 8080 # 设置 Service 暴露的端口为 8080, 即8080(svc) <-> 80(pod)
targetPort: 8080 # 设置 Pod 的端口为 8080
nodePort: 30081 # 设置 NodePort 的端口为 30081,即30081(NodePort) <-> 8080(svc) <-> 80(Pod)
selector:
app: webapp
minikube kubectl -- apply -f webapp-svc.yaml
[tavion@tavion-m410 ~]$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
webapp NodePort 10.100.227.225 <none> 8080:31155/TCP 12h
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13h
[tavion@tavion-m410 ~]$ ^C
[tavion@tavion-m410 ~]$ curl http://localhost:31155/version
test-v3.1
5.2.1. 例子
服务demo 和 服务demo2
语法:
http://[服务名].[namespace]:[端口]/
服务状态
[tavion@tavion-m410 k8s]$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demo NodePort 10.100.227.225 <none> 8080:31155/TCP 18h
demo2 NodePort 10.105.19.92 <none> 8080:30910/TCP 15m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 18h
服务demo2 可以通过 http://demo.default:8080/ 访问demo
6. 挂载卷
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo
spec:
replicas: 3
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- name: demo
image: tavion.com:8380/repos/demo:${version}
ports:
- containerPort: 8080
# volumeMounts: # 映射到docker容器的卷目录或文件
# - name: nginx-volume-dir # 映射的卷别名
# mountPath: /var/log/nginx # 映射到容器的目录
# - name: nginx-volume-file # 映射的卷别名
# mountPath: /var/log/nginx/access2.log # 映射到容器的目录
# volumes: # 挂载系统的卷
# - name: nginx-volume-dir # 挂载的卷的别名
# hostPath:
# path: /path/on/host # 挂载的卷路径
# - name: nginx-volume-file # 挂载的卷的别名
# hostPath:
# path: /path/on/host/access2.log # 挂载的卷文件
7. 补充语句
访问pod容器,例如:
kubectl exec it mynginx -c tomcat -- sh
kubectl exec it mynginx sh
更新镜像
kubectl set image deployment my-tomcat tomcat=tomcat:10.1.11 --record
回退镜像
kubectl rollout history deploy my-tomcat
8. 部署项目
8.1. 部署springboot项目
https://gitee.com/alvis128/demo.git
https://gitee.com/alvis128/demo2.git
8.1.1. 流程
安装插件:verion number
重启jenkins
新建Item
配置拉取仓库
构造环境,添加版本信息
添加Build Steps操作
Build Steps 步骤选项:
Build Steps -1 ,编译,因为我是用gradle编译的,你们可能是maven
Build Steps -2 ,发布到harbor仓库中
Build Steps -3 ,使用k8s 部署springboot项目
保存后,然后运行BuildNow
在控制台查看日志
9. 术语
k8s 里面的一些术语:
- deployment 部署项目,用来管理pod节点,可以控制pod节点启动、关闭、添加pod等等(部署)
- pod 是服务的最小单位,每个pod里面都有一个docker。(服务)
- service 是管理pod服务之间的通讯关系的,(网络方面)
- ingress 是管理service服务之间的通讯关系(网络方面)
kubernetes里有三张不同的网络,每种IP地址,就代表一个不同的寻址空间:
- Node IP:Node节点的IP地址
- Pod IP:Pod的IP地址
- Cluster IP:内部或集群内访问Service的IP地址
- External IP是 为了解决如何从外部访问 service 服务的问题。
简写
- service - svc
- podes - po
例如 : kubectl get svc 等同于 kubectl get service