k8s-基础入门
kubeadm-dind-cluster 工具来快速地部署一个 kubernetes 集群,并且在其上使用 kubectl 来熟练掌握集群的基本结构及概念。
知识点
- Kubernetes 集群的基本结构
- kubectl 的基本使用
- Resource 的基本概念
- Namespace 的基本概念
相关链接
kubeadm-dind-cluster 提供了一种非常简单的运行 kubernetes 集群的方式。我们可以使用预先提供的脚本直接运行一个 kubernetes 集群。本次实验所使用的 kubernetes 环境 为 1.15。
1 2 3 4 5 6 7 8 9 10 11 | tom @ubuntu :~/Desktop/k8s/Code$ docker info Client: Context: default Debug Mode: false Plugins: app: Docker App (Docker Inc., v0. 9.1 -beta3) buildx: Build with BuildKit (Docker Inc., v0. 5.1 -docker) Server: ERROR: Got permission denied while trying to connect to the Docker daemon socket at unix: ///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.24/info: dial unix /var/run/docker.sock: connect: permission denied errors pretty printing info |
ERROR: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/
1 2 3 4 | sudo groupadd docker #添加docker用户组 sudo gpasswd -a $XXX docker #检测当前用户是否已经在docker用户组中,其中XXX为用户名,例如我的,liangll sudo gpasswd -a $USER docker #将当前用户添加至docker用户组 newgrp docker #更新docker用户组 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | tom @ubuntu :~/Desktop/k8s/Code$ ./dind-cluster-v1. 15 .sh WARNING: No swap limit support usage: ./dind-cluster-v1. 15 .sh up ./dind-cluster-v1. 15 .sh reup ./dind-cluster-v1. 15 .sh down ./dind-cluster-v1. 15 .sh init kubeadm-args... ./dind-cluster-v1. 15 .sh join kubeadm-args... ./dind-cluster-v1. 15 .sh clean ./dind-cluster-v1. 15 .sh pause ./dind-cluster-v1. 15 .sh unpause ./dind-cluster-v1. 15 .sh snapshot ./dind-cluster-v1. 15 .sh restore ./dind-cluster-v1. 15 .sh copy-image [image_name] ./dind-cluster-v1. 15 .sh e2e [test-name-substring] ./dind-cluster-v1. 15 .sh e2e-serial [test-name-substring] ./dind-cluster-v1. 15 .sh dump ./dind-cluster-v1. 15 .sh dump64 ./dind-cluster-v1. 15 .sh split-dump ./dind-cluster-v1. 15 .sh split-dump64 |
需要用到的命令不多,直接用 up 就可以启动一个集群
由于 coredns 和 kubernetes-dashboard 启动需要消耗较长时间并且在实验环境中会启动失败,所以脚本中已经禁用了这两项。而且它们在实验中用到的地方不多,具体可以等到用到的时候再处理
从输出的结果来看,kubernetes 集群也是一个典型的 master-slave 架构。这样的结构中 master 节点上会部署很多控制组件,slave 上只需运行一些 agent 即可。
curl: (35) gnutls_handshake() failed: Error in the pull function
1 2 3 | 执行sudo apt-get install libcurl4-openssl-dev 执行此句时会把libcurl4-gnutls-dev这个包给删除先,然后再安装。这两个包是互相冲突的,安谁会把另一个先卸掉。 大概理解是,curl的依赖包中有libcurl4-gnutls-dev,这个是默认的,但我们需要libcurl4-openssl-dev,因为这个更好用,对https支持地更好<br><br> |
tom@ubuntu:~/Desktop/k8s/Code$ curl -V
curl 7.47.0 (x86_64-pc-linux-gnu) libcurl/7.47.0 GnuTLS/3.4.10 zlib/1.2.8 libidn/1.32 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP UnixSockets
小窍门
1 2 | gpasswd -a cold root //将用户cold加入到root组 gpasswd -d cold root //将用户cold从root组中移出 |
kubectl 的基本使用
kubectl 是与 kubernetes 集群交互的一个命令行工具。我们可以用它来查看和管理 kubernetes 集群。kubernetes 对外通过 http 端口暴露服务,kubectl 正是通过与 kubernets api server 的 http 端口交互来操作集群。
1 |
tom@ubuntu:~/Desktop/k8s/Code$ sudo vim /etc/sysctl.conf
[sudo] password for tom:
tom@ubuntu:~/Desktop/k8s/Code$ sudo sysctl -p
vm.max_map_count = 655360
vm.swappiness = 0
kernel.sysrq = 1
net.ipv4.neigh.default.gc_stale_time = 120
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | shiyanlou:~/ $ cat /etc/hosts [ 16 : 57 : 08 ] 127.0 . 0.1 localhost # The following lines are desirable for IPv6 capable hosts :: 1 localhost ip6-localhost ip6-loopback ff02:: 1 ip6-allnodes ff02:: 2 ip6-allrouters 172.20 . 102.125 iZrj92px5d0b9btkc0hzewZ iZrj92px5d0b9btkc0hzewZ 10.111 . 123.198 iZbp181owrnv9r9uzp4pt1Z iZbp181owrnv9r9uzp4pt1Z 10.111 . 126.135 iZbp18wjcayoy3u826rcpeZ iZbp18wjcayoy3u826rcpeZ 10.111 . 114.26 iZbp1967kgohhiwr38iwirZ iZbp1967kgohhiwr38iwirZ |
1 2 3 4 5 6 7 8 9 | tom @ubuntu :~/Desktop/ 3 /docker2$ docker stop $(docker ps -aq) a7ffdde23269 540b166bc8d9 9e61e4b80a96 tom @ubuntu :~/Desktop/ 3 /docker2$ docker rm $(docker ps -aq) a7ffdde23269 540b166bc8d9 9e61e4b80a96 tom @ubuntu :~/Desktop/ 3 /docker2$ docker rmi $(docker images -q) |
1 2 3 4 5 6 7 8 9 10 11 12 13 | 配置镜像加速器 针对Docker客户端版本大于 1.10 . 0 的用户 您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<- 'EOF' { "registry-mirrors" : [ "https://19b12x6i.mirror.aliyuncs.com" ] } EOF sudo systemctl daemon-reload sudo systemctl restart docker |
minikube
https://minikube.sigs.k8s.io/docs/start/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | curl -LO https: //storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube sudo usermod -aG docker $USER && newgrp docker<br><br> minikube start Interact with your cluster If you already have kubectl installed, you can now use it to access your shiny new cluster: kubectl get po -A Alternatively, minikube can download the appropriate version of kubectl, if you don’t mind the double -dashes in the command-line: minikube kubectl -- get po -A Initially, some services such as the storage-provisioner, may not yet be in a Running state. This is a normal condition during cluster bring-up, and will resolve itself momentarily. For additional insight into your cluster state, minikube bundles the Kubernetes Dashboard, allowing you to get easily acclimated to your new environment: minikube dashboard 4Deploy applications Create a sample deployment and expose it on port 8080 : kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver: 1.4 kubectl expose deployment hello-minikube --type=NodePort --port= 8080 It may take a moment, but your deployment will soon show up when you run: kubectl get services hello-minikube The easiest way to access this service is to let minikube launch a web browser for you: minikube service hello-minikube Alternatively, use kubectl to forward the port: kubectl port-forward service/hello-minikube 7080 : 8080 Tada! Your application is now available at http: //localhost:7080/ LoadBalancer deployments To access a LoadBalancer deployment, use the “minikube tunnel” command. Here is an example deployment: kubectl create deployment balanced --image=k8s.gcr.io/echoserver: 1.4 kubectl expose deployment balanced --type=LoadBalancer --port= 8080 In another window, start the tunnel to create a routable IP for the ‘balanced’ deployment: minikube tunnel To find the routable IP, run this command and examine the EXTERNAL-IP column: kubectl get services balanced Your deployment is now available at <EXTERNAL-IP>: 8080 5Manage your cluster Pause Kubernetes without impacting deployed applications: minikube pause Halt the cluster: minikube stop Increase the default memory limit (requires a restart): minikube config set memory 16384 Browse the catalog of easily installed Kubernetes services: minikube addons list Create a second cluster running an older Kubernetes release: minikube start -p aged --kubernetes-version=v1. 16.1 Delete all of the minikube clusters: minikube delete --all |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | docker批量导入镜像 ll *.image|awk '{print $NF}' |sed -r 's#(.*)#docker load -i \1#' |bash 使用一段时间Docker之后,本地会有很多的没用了的镜像,逐条手动删除很费时,所以弄个脚本批量删除,如下,删除以 192.168 . 33.10 开头的镜像名称,只要这个镜像没有被使用,会被删除。 List- 1 docker images|awk '{print $1":"$2}' |grep 192.168 . 33.10 |xargs -t docker rmi 如下若是,除了mysql、postgresql、kibana、elastic、mongo除外的没有在运行的容器会被删除,xargs的-t参数会打印出执行的命令 List- 2 docker ps -a|egrep -v 'mysql|post|kiban|elas|mongo' |awk '{print $1}' |xargs -t docker rm 有些时候会有些<none>的镜像,如下List- 3 ,可能是临时产生的,删除这种镜像,直接用List- 1 中的是不行的 List- 3 mjduan @mjduan :/opt/tmp/images$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> fb522ae76d1c 3 days ago 993MB <none> <none> 4966b6e23631 3 days ago 662MB <none> <none> 3d30ff829e3d 3 days ago 738MB <none> <none> 82d66f605ccd 3 days ago 738MB <none> <none> 53df78f6d849 3 days ago 683MB <none> <none> dd914a092541 3 days ago 738MB List- 4 #这种,注意awk中要用\t隔开,后面的awk才能得到我们想要的$ 2 docker images|awk '{print $1"\t"$3}' |grep "<none" |awk '{print $2}' | xargs -t docker rmi #或者下面这种 docker images|grep "<none" |awk '{print $3}' |xargs -t docker rmi |
docker批量导出镜像
docker将镜像上传到仓库
使用python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | import os import subprocess import re if __name__ == "__main__" : # sudo docker login --username= 15088694571 registry.cn-hangzhou.aliyuncs.com 987654321qwe p = subprocess.Popen( 'docker images' , shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) for line in p.stdout.readlines(): #print(line) m = re.match(r '([^\s]*\s*)\s([^\s]*\s)' , line.decode( "utf-8" )) # print(m.group( 1 ).strip( '' )+ "" +m.group( 2 ).strip( '' )) iname = m.group( 1 ).strip() itag = m.group( 2 ).strip() tarname = iname+ ":" +itag filename = iname.split( "/" )[- 1 ].strip() targetname = "registry.cn-hangzhou.aliyuncs.com/lzj123/" +filename+ ":" +itag cmd = "docker tag " +tarname+ " " + targetname print( "cmd-----------------------------" ) print(cmd) os.system(cmd) #docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent: 0.7 -dfb6816 cmd2 = "docker push " + " " + targetname print(cmd2) # sudo docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent: 0.7 -dfb6816 os.system(cmd2) print( "cmd-----------------------------" ) retval = p.wait() |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现