Docker集群管理工具-Kubernetes部署记录

Kubernetes介绍

1

2

3

4

5

6

7

8

9

Kubernetes是Google开源的容器集群管理系统,是基于Docker构建一个容器的调度服务,提供资源调度、均衡容灾、服务注册、动态扩缩容等功能套件。

Kubernetes提供应用部署、维护、 扩展机制等功能,利用Kubernetes能方便地管理跨机器运行容器化的应用,其主要功能如下:

1) 使用Docker对应用程序包装(package)、实例化(instantiate)、运行(run)。

2) 将多台Docker主机抽象为一个资源,以集群的方式运行、管理跨机器的容器,包括任务调度、资源管理、弹性伸缩、滚动升级等功能。

3)使用编排系统(YAML File)快速构建容器集群,提供负载均衡,解决容器直接关联及通信问题

4) 解决Docker跨机器容器之间的通讯问题。

5)自动管理和修复容器,简单说,比如创建一个集群,里面有十个容器,如果某个容器异常关闭,那么,会尝试重启或重新分配容器,始终保证会有

   十个容器在运行,反而杀死多余的。

   Kubernetes的自我修复机制使得容器集群总是运行在用户期望的状态当前Kubernetes支持GCE、vShpere、CoreOS、OpenShift。

 

Kubernetes和Mesos的区别

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

1)Mesos是Apache下的开源分布式资源管理框架,它被称为是分布式系统的内核;

  Kubernetes是Google开源的容器集群管理系统,实现基于Docker构建容器,利用Kubernetes能很方面管理多台Docker主机中的容器。

   

2)Mesos负责管理集群管资源(动态运行时,某机器有额外的资源,通知master来分配);

   Kubernetes抽象出新的容器组合模型并且对其编排管理(把容器自由组合提供服务这事儿搞定了,从而微服务,serverless等才真

   正的优雅地在开发和运维之间不吵架地被实现),而且kubernetes把以前运维的很多很难搞的东西都变得容易了。比如OpenStack,

   Kubernetes是把OpenStack里面的VM换成了容器,但是实现地更漂亮,更精简,更抽象和本质化,用起来也更容易。

   

3)Mesos相比Kubernetes发展的时间更久,总体情况更成熟,在生产环境有更多的使用经验,国外使用Mesos的公司有Twitter,Apple,

   Airbnb,Uber等,国内也有大批知名公司在使用Mesos,比如:小米、当当、豆瓣、去哪儿、携程、唯品会、知乎、新浪微博、爱奇艺、

   七牛、唯品会、bilibili、中国联通、中国移动、中国电信、华为、数人云等等。中大型公司会更倾向于使用Mesos,

   因为本身这些公司有一定的开发能力,Mesos提供了良好的API而且有非常多成熟的Framework跑在Mesos上,Mesos+Marathon+Zookeeper

   正常情况可以满足绝大部分需求,只需要写JSON或者DSL定义好service/application就好,只有一些特殊情况才确实需要写自己的Framework。

   

   而kubernetes(k8s)现在也正在慢慢成熟起来,它在生产环境显然还需要更多时间来验证。京东目前已经在kubernetes上跑15W+容器了。

    

   Mesos现在越来越适应并且被添加上了很多Kubernete的概念同时支持了很多Kubernetes的API。因此如果你需要它们的话,它将是对你的

   Kubernetes应用去获得更多能力的一个便捷方式(比如高可用的主干、更加高级的调度命令、去管控很大数目结点的能力),同时能够很好的

   适用于产品级工作环境中(毕竟Kubernetes任然还是一个初始版本)。

   

4)如果你是一个集群世界的新手,Kubernetes是一个很棒的起点。它是最快的、最简单的、最轻量级的方法去摆脱束缚,同时开启面向集群开发的实践。

   它提供了一个高水平的可移植方案,因为它是被一些不同的贡献者所支持的(    例如微软、IBM、Red Hat、CoreOs、MesoSphere、VMWare等等)。

   

   如果你已经有已经存在的工作任务(Hadoop、Spark、Kafka等等),Mesos给你提供了一个可以让你将不同工作任务相互交错的框架,然后混合进一个

   包含Kubernetes 应用的新的东西。

   

   如果你还没有用Kubernetes 系列框架完成项目的能力,Mesos给了你一个减压阀。

 

Kubernetes结构图

 

kubernetes角色组成

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

1)Pod

在Kubernetes系统中,调度的最小颗粒不是单纯的容器,而是抽象成一个Pod,Pod是一个可以被创建、销毁、调度、管理的最小的部署单元。

比如一个或一组容器。Pod是kubernetes的最小操作单元,一个Pod可以由一个或多个容器组成;同一个Pod只能运行在同一个主机上,共享相

同的volumes、network、namespace;

   

2)ReplicationController(RC)

RC用来管理Pod,一个RC可以由一个或多个Pod组成,在RC被创建后,系统会根据定义好的副本数来创建Pod数量。在运行过程中,如果Pod数量

小于定义的,就会重启停止的或重新分配Pod,反之则杀死多余的。当然,也可以动态伸缩运行的Pods规模或熟悉。RC通过label关联对应的Pods,

在滚动升级中,RC采用一个一个替换要更新的整个Pods中的Pod。

   

Replication Controller是Kubernetes系统中最有用的功能,实现复制多个Pod副本,往往一个应用需要多个Pod来支撑,并且可以保证其复制的

副本数,即使副本所调度分配的宿主机出现异常,通过Replication Controller可以保证在其它主宿机启用同等数量的Pod。Replication Controller

可以通过repcon模板来创建多个Pod副本,同样也可以直接复制已存在Pod,需要通过Label selector来关联。

   

3)Service

Service定义了一个Pod逻辑集合的抽象资源,Pod集合中的容器提供相同的功能。集合根据定义的Label和selector完成,当创建一个Service后,

会分配一个Cluster IP,这个IP与定义的端口提供这个集合一个统一的访问接口,并且实现负载均衡。

   

Services是Kubernetes最外围的单元,通过虚拟一个访问IP及服务端口,可以访问我们定义好的Pod资源,目前的版本是通过iptables的nat转发来实现,

转发的目标端口为Kube_proxy生成的随机端口,目前只提供GOOGLE云上的访问调度,如GCE。

    

4)Label

Label是用于区分Pod、Service、RC的key/value键值对;仅使用在Pod、Service、Replication Controller之间的关系识别,但对这些单元本身进行操

作时得使用name标签。Pod、Service、RC可以有多个label,但是每个label的key只能对应一个;主要是将Service的请求通过lable转发给后端提供服务的Pod集合;

   

说说个人一点看法,目前Kubernetes保持一周一小版本、一个月一大版本的节奏,迭代速度极快,同时也带来了不同版本操作方法的差异,另外官网文档更新速度

相对滞后及欠缺,给初学者带来一定挑战。在上游接入层官方侧重点还放在GCE(Google Compute Engine)的对接优化,针对个人私有云还未推出一套可行的接入

解决方案。在v0.5版本中才引用service代理转发的机制,且是通过iptables来实现,在高并发下性能令人担忧。但作者依然看好Kubernetes未来的发展,至少目前

还未看到另外一个成体系、具备良好生态圈的平台,相信在V1.0时就会具备生产环境的服务支撑能力。

 

kubernetes组件组成

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

1)kubectl

客户端命令行工具,将接受的命令格式化后发送给kube-apiserver,作为整个系统的操作入口。

  

2)kube-apiserver

作为整个系统的控制入口,以REST API服务提供接口。

  

3)kube-controller-manager

用来执行整个系统中的后台任务,包括节点状态状况、Pod个数、Pods和Service的关联等。

  

4)kube-scheduler

负责节点资源管理,接受来自kube-apiserver创建Pods任务,并分配到某个节点。

  

5)etcd

负责节点间的服务发现和配置共享。

  

6)kube-proxy

运行在每个计算节点上,负责Pod网络代理。定时从etcd获取到service信息来做相应的策略。

  

7)kubelet

运行在每个计算节点上,作为agent,接受分配该节点的Pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver。

  

8)DNS

一个可选的DNS服务,用于为每个Service对象创建DNS记录,这样所有的Pod就可以通过DNS访问服务了。

 

Kubelet

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

根据上图可知Kubelet是Kubernetes集群中每个Minion和Master API Server的连接点,Kubelet运行在每个Minion上,是Master API Server和Minion之间的桥梁,

接收Master API Server分配给它的commands和work,与持久性键值存储etcd、file、server和http进行交互,读取配置信息。Kubelet的主要工作是管理Pod和容

器的生命周期,其包括Docker Client、Root Directory、Pod Workers、Etcd Client、Cadvisor Client以及Health Checker组件,具体工作如下:

1) 通过Worker给Pod异步运行特定的Action。

2) 设置容器的环境变量。

3) 给容器绑定Volume。

4) 给容器绑定Port。

5) 根据指定的Pod运行一个单一容器。

6) 杀死容器。

7) 给指定的Pod创建network 容器。

8) 删除Pod的所有容器。

9) 同步Pod的状态。

10) 从Cadvisor获取container info、 pod info、root info、machine info。

11) 检测Pod的容器健康状态信息。

12) 在容器中运行命令

 

kubernetes基本部署步骤

1

2

3

4

5

6

7

8

9

10

11

1)minion节点安装docker

2)minion节点配置跨主机容器通信

3)master节点部署etcd、kube-apiserver、kube-controller-manager和kube-scheduler组件

4)minion节点部署kubelet、kube-proxy组件

注:推荐将etcd做成集群,所有节点都安装etcd。这里的使用master来搭建私有仓库供minion节点使用。

  

温馨提示:

如果minion主机没有安装docker,启动kubelet时会报如下错误:

Could not load kubeconfig file /var/lib/kubelet/kubeconfig: stat /var/lib/kubelet/kubeconfig: no such file or directory. Trying auth path instead.

Could not load kubernetes auth path /var/lib/kubelet/kubernetes_auth: stat /var/lib/kubelet/kubernetes_auth: no such file or directory. Continuing with defaults.

No cloud provider specified.

 

kubernetes集群环境部署过程记录

1

2

3

4

5

主机名         IP          节点及功能            系统版本

registry    10.10.172.202   registry             CentOS7.2

K8S-master  10.10.172.202   Master、etcd         CentOS7.2

K8S-node-1  10.10.172.203   Node1                    CentOS7.2

K8S-node-2  10.10.172.204   Node2                    CentOS7.2

 

0)设置三台机器的主机名

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

Registry上执行:

[root@localhost ~]# hostnamectl --static set-hostname  registry

 

Master上执行:

[root@localhost ~]# hostnamectl --static set-hostname  k8s-master

  

Node1上执行:

[root@localhost ~]# hostnamectl --static set-hostname  k8s-node-1

  

Node2上执行:

[root@localhost ~]# hostnamectl --static set-hostname  k8s-node-2

  

在三台机器上都要设置hosts,均执行如下命令:

[root@k8s-master ~]# vim /etc/hosts

10.10.172.201    registry

10.10.172.202    k8s-master

10.10.172.202    etcd

10.10.172.203    k8s-node-1

10.10.172.204    k8s-node-2

 

1)关闭三台机器上的防火墙和SElinux

1

2

3

4

5

6

7

8

9

10

[root@k8s-master ~]# systemctl disable firewalld.service

[root@k8s-master ~]# systemctl stop firewalld.service

注:建议安装iptable防火墙,yum install iptables-service -y;systemctl start iptables.service;systemctl enable iptables.service

 

[root@k8s-master ~]# sed -i "/SELINUX/s/enforcing/disabled/g" /etc/selinux/config

[root@k8s-master ~]# reboot

[root@k8s-master ~]# getenforce

Disabled

注:docker 1.13.1 需要关闭selinux或者升级内核,才可以启动docker。

启动报错提示:Error starting daemon: SELinux is not supported with the overlay2 graph driver on this kernel

 

2)docker私有仓库建立

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

环境说明:

 

我们选取10.10.172.201做私有仓库地址

yum install docker -y

 

1.启动docker仓库端口服务

 

docker run -d -p 5000:5000 --name=registry --privileged=true --restart=always -v /data/history:/data/registry registry 

 

2.查看docker仓库端口服务

 

# curl -XGET http://10.10.172.201:5000/v2/_catalog

# curl -XGET http://10.10.172.201:5000/v2/image_name/tags/list

 

3.将自己的镜像加到docker仓库

 

1).加载到自己的私有仓库

docker pull busybox

docker tag busybox 10.10.172.201:5000/busybox

docker push 10.10.172.201:5000/busybox

     

docker push 上传镜像到本地私有仓库时报错提示:

The push refers to a repository [10.10.172.201:5000/busybox]

Get https://10.10.172.201:5000/v1/_ping: http: server gave HTTP response to HTTPS client

解决方法:

修改服务端docker配置文件/etc/sysconfig/docker添加如下代码,同时重启docker服务:

OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --insecure-registry 10.10.172.201:5000'

ADD_REGISTRY='--add-registry 10.10.172.201:5000'

     

2).检查本地私有仓库是否成功    

[root@k8s-master ~]# curl -XGET http://10.10.172.201:5000/v2/_catalog

{"repositories":["busybox"]}  

[root@k8s-master ~]# curl -XGET http://10.10.172.201:5000/v2/busybox/tags/list

{"name":"busybox","tags":["latest"]}

 

 

4.docker客户端使用本地私有仓库:

 

修改配置文件/etc/sysconfig/docker,添加如下代码,同时重启docker服务:

OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --insecure-registry 10.10.172.201:5000'

ADD_REGISTRY='--add-registry 10.10.172.201:5000'

或者:

修改配置文件/etc/docker/daemon.json,添加如下代码,同时重启docker服务:

"insecure-registries":["10.10.172.201:5000"] }

或者:

"insecure-registries":["10.10.172.201:5000"],

"registry-mirrors": ["http://df98fb04.m.daocloud.io"]} 

至此,docker本地私有仓库部署完毕,可以向仓库中添加或者更新Docker镜像。

 

3)现在开始部署Master

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

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

1)先安装docker环境

[root@k8s-master ~]# yum install -y docker

   

配置Docker配置文件,使其允许从registry中拉取镜像

[root@k8s-master ~]# vim /etc/sysconfig/docker      #添加下面一行内容

......

OPTIONS='--insecure-registry registry:5000'

    

[root@k8s-master ~]# systemctl start docker

   

2)安装etcd

k8s运行依赖etcd,需要先部署etcd,下面采用yum方式安装:

[root@k8s-master ~]# yum install etcd -y

    

yum安装的etcd默认配置文件在/etc/etcd/etcd.conf,编辑配置文件:

[root@k8s-master ~]# cp /etc/etcd/etcd.conf{,.bak}

[root@k8s-master ~]# cat /etc/etcd/etcd.conf

#[member]

ETCD_NAME=master                                            #节点名称

ETCD_DATA_DIR="/var/lib/etcd/default.etcd"                  #数据存放位置

#ETCD_WAL_DIR=""

#ETCD_SNAPSHOT_COUNT="10000"

#ETCD_HEARTBEAT_INTERVAL="100"

#ETCD_ELECTION_TIMEOUT="1000"

#ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"

ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"             #监听客户端地址

#ETCD_MAX_SNAPSHOTS="5"

#ETCD_MAX_WALS="5"

#ETCD_CORS=""

#

#[cluster]

#ETCD_INITIAL_ADVERTISE_PEER_URLS="http://localhost:2380"

# if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."

#ETCD_INITIAL_CLUSTER="default=http://localhost:2380"

#ETCD_INITIAL_CLUSTER_STATE="new"

#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"

ETCD_ADVERTISE_CLIENT_URLS="http://etcd:2379,http://etcd:4001"           #通知客户端地址

#ETCD_DISCOVERY=""

#ETCD_DISCOVERY_SRV=""

#ETCD_DISCOVERY_FALLBACK="proxy"

#ETCD_DISCOVERY_PROXY=""

    

启动etcd并验证状态

[root@k8s-master ~]# systemctl start etcd;systemctl enable etcd

    

[root@k8s-master ~]# ps -ef|grep etcd

etcd     28145     1  1 14:38 ?        00:00:00 /usr/bin/etcd --name=master --data-dir=/var/lib/etcd/default.etcd --listen-client-urls=http://0.0.0.0:2379,http://0.0.0.0:4001

root     28185 24819  0 14:38 pts/1    00:00:00 grep --color=auto etcd

[root@k8s-master ~]# lsof -i:2379

COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME

etcd    28145 etcd    6u  IPv6 1283822      0t0  TCP *:2379 (LISTEN)

etcd    28145 etcd   18u  IPv6 1284133      0t0  TCP localhost:53203->localhost:2379 (ESTABLISHED)

........

    

[root@k8s-master ~]# etcdctl set testdir/testkey0 0

0

[root@k8s-master ~]# etcdctl get testdir/testkey0

0

[root@k8s-master ~]# etcdctl -C http://etcd:4001 cluster-health

member 8e9e05c52164694d is healthy: got healthy result from http://etcd:2379

cluster is healthy

[root@k8s-master ~]# etcdctl -C http://etcd:2379 cluster-health

member 8e9e05c52164694d is healthy: got healthy result from http://etcd:2379

cluster is healthy

[root@k8s-master ~]# etcdctl  member list

8e9e05c52164694d: name=default peerURLs=http://localhost:2380 clientURLs=http://etcd:2379,http://etcd:4001 isLeader=true

   

3)安装kubernets

[root@k8s-master ~]# yum install kubernetes -y  #其实只需安装kubernetes-master

    

配置并启动kubernetes

在kubernetes master上需要运行以下组件:Kubernets API Server、Kubernets Controller Manager、Kubernets Scheduler

    

[root@k8s-master ~]# cp /etc/kubernetes/apiserver{,.bak}

[root@k8s-master ~]# vim /etc/kubernetes/apiserver

###

# kubernetes system config

#

# The following values are used to configure the kube-apiserver

#

    

# The address on the local server to listen to.

KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"

    

# The port on the local server to listen on.

KUBE_API_PORT="--port=8080"

    

# Port minions listen on

# KUBELET_PORT="--kubelet-port=10250"

    

# Comma separated list of nodes in the etcd cluster

KUBE_ETCD_SERVERS="--etcd-servers=http://etcd:2379"

    

# Address range to use for services

KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=192.168.21.0/24"

    

# default admission control policies

#KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"

KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

    

# Add your own!

KUBE_API_ARGS=""

    

[root@k8s-master ~]# cp /etc/kubernetes/config{,.bak}

[root@k8s-master ~]# vim /etc/kubernetes/config

###

# kubernetes system config

#

# The following values are used to configure various aspects of all

# kubernetes services, including

#

#   kube-apiserver.service

#   kube-controller-manager.service

#   kube-scheduler.service

#   kubelet.service

#   kube-proxy.service

# logging to stderr means we get it in the systemd journal

KUBE_LOGTOSTDERR="--logtostderr=true"

  

# journal message level, 0 is debug

KUBE_LOG_LEVEL="--v=0"

  

# Should this cluster be allowed to run privileged docker containers

KUBE_ALLOW_PRIV="--allow-privileged=false"

  

# How the controller-manager, scheduler, and proxy find the apiserver

KUBE_MASTER="--master=http://k8s-master:8080"

  

启动服务并设置开机自启动

[root@k8s-master ~]# systemctl enable kube-apiserver.service

[root@k8s-master ~]# systemctl start kube-apiserver.service

[root@k8s-master ~]# systemctl enable kube-controller-manager.service

[root@k8s-master ~]# systemctl start kube-controller-manager.service

[root@k8s-master ~]# systemctl enable kube-scheduler.service

[root@k8s-master ~]# systemctl start kube-scheduler.service

 

4)接着部署Node(在两台node节点机器上都要操作)

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

64

65

66

67

68

69

70

71

72

73

1)安装docker

[root@k8s-node-1 ~]# yum install -y docker

  

配置Docker配置文件,使其允许从registry中拉取镜像

[root@k8s-node-1 ~]# vim /etc/sysconfig/docker      #添加下面一行内容

......

OPTIONS='--insecure-registry registry:5000'

    

[root@k8s-node-1 ~]# systemctl start docker;systemctl enable docker

  

2)安装kubernets

[root@k8s-node-1 ~]# yum install kubernetes -y #其实只需安装kubernetes-node即可

  

配置并启动kubernetes

在kubernetes master上需要运行以下组件:Kubelet、Kubernets Proxy

[root@k8s-node-1 ~]# cp /etc/kubernetes/config{,.bak}

[root@k8s-node-1 ~]# vim /etc/kubernetes/config

###

# kubernetes system config

#

# The following values are used to configure various aspects of all

# kubernetes services, including

#

#   kube-apiserver.service

#   kube-controller-manager.service

#   kube-scheduler.service

#   kubelet.service

#   kube-proxy.service

# logging to stderr means we get it in the systemd journal

KUBE_LOGTOSTDERR="--logtostderr=true"

  

# journal message level, 0 is debug

KUBE_LOG_LEVEL="--v=0"

  

# Should this cluster be allowed to run privileged docker containers

KUBE_ALLOW_PRIV="--allow-privileged=false"

  

# How the controller-manager, scheduler, and proxy find the apiserver

KUBE_MASTER="--master=http://k8s-master:8080"

  

[root@k8s-node-1 ~]# cp /etc/kubernetes/kubelet{,.bak}

[root@k8s-node-1 ~]# vim /etc/kubernetes/kubelet

###

# kubernetes kubelet (minion) config

  

# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)

KUBELET_ADDRESS="--address=0.0.0.0"

  

# The port for the info server to serve on

# KUBELET_PORT="--port=10250"

  

# You may leave this blank to use the actual hostname

KUBELET_HOSTNAME="--hostname-override=k8s-node-1"                  #特别注意这个,在另一个node2节点上,要改为k8s-node-2

  

# location of the api-server

KUBELET_API_SERVER="--api-servers=http://k8s-master:8080"

  

# pod infrastructure container

KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

  

# Add your own!

KUBELET_ARGS=""

  

加速器配置(可选) 

[root@k8s-node-1 ~]# cat /etc/docker/daemon.json 

{"registry-mirrors": ["http://df98fb04.m.daocloud.io"]}

[root@k8s-node-1 ~]

 

启动服务并设置开机自启动

[root@k8s-node-1 ~]# systemctl enable kubelet.service

[root@k8s-node-1 ~]# systemctl start kubelet.service

[root@k8s-node-1 ~]# systemctl enable kube-proxy.service

[root@k8s-node-1 ~]# systemctl start kube-proxy.service

 

查看状态

1

2

3

4

5

6

7

8

[root@k8s-master ~]# kubectl -s http://k8s-master:8080 get node

NAME         STATUS    AGE

k8s-node-1   Ready     29s

k8s-node-2   Ready     28s

[root@k8s-master ~]# kubectl get nodes

NAME         STATUS    AGE

k8s-node-1   Ready     44s

k8s-node-2   Ready     43s

 

kubernetes常用命令

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

查看node主机

[root@k8s-master ~]# kubectl get node        //有的环境是用monion,那么查看命令就是"kubectl get minions"  

  

查看pods清单

[root@k8s-master ~]# kubectl get pods  

  

查看service清单

[root@k8s-master ~]# kubectl get services      //或者使用命令"kubectl get services -o json"

  

查看replicationControllers清单

[root@k8s-master ~]# kubectl get replicationControllers   

  

删除所有pods(同理将下面命令中的pods换成services或replicationControllers,就是删除所有的services或replicationContronllers)

[root@k8s-master ~]# for i in `kubectl get pod|tail -n +2|awk '{print $1}'`; do kubectl delete pod $i; done   

  

--------------------------------------------------------------------------

除了上面那种查看方式,还可以通过Server api for REST方式(这个及时性更高)

  

查看kubernetes版本

[root@k8s-master ~]# curl -s -L http://10.10.172.202:8080/api/v1beta1/version | python -mjson.tool

  

查看pods清单

[root@k8s-master ~]# curl -s -L http://10.10.172.202:8080/api/v1beta1/pods | python -mjson.tool

  

查看replicationControllers清单

[root@k8s-master ~]# curl -s -L http://10.10.172.202:8080/api/v1beta1/replicationControllers | python -mjson.tool

  

查查看node主机(或者是minion主机,将下面命令中的node改成minion)

[root@k8s-master ~]# curl -s -L http://10.10.172.202:8080/api/v1beta1/node | python -m json.tool

  

查看service清单

[root@k8s-master ~]# curl -s -L http://10.10.172.202:8080/api/v1beta1/services | python -m json.tool

  

温馨提示:

在新版Kubernetes中,所有的操作命令都整合至kubectl,包括kubecfg、kubectl.sh、kubecfg.sh等

 

5)创建覆盖网络——Flannel

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

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

1)安装Flannel(在master、node上均执行如下命令,进行安装)

[root@k8s-master ~]# yum install flannel -y  #etcd节点和node节点都需要安装flannel

   

2)配置Flannel(在master、node上均编辑/etc/sysconfig/flanneld

[root@k8s-master ~]# cp /etc/sysconfig/flanneld{,.bak}

[root@k8s-master ~]# vim /etc/sysconfig/flanneld

# Flanneld configuration options

   

# etcd url location.  Point this to the server where etcd runs

FLANNEL_ETCD_ENDPOINTS="http://etcd:2379"

   

# etcd config key.  This is the configuration key that flannel queries

# For address range assignment

FLANNEL_ETCD_PREFIX="/atomic.io/network"

   

# Any additional options that you want to pass

#FLANNEL_OPTIONS=""

   

3)配置etcd中关于flannel的key(这个只在master上操作)

Flannel使用Etcd进行配置,来保证多个Flannel实例之间的配置一致性,所以需要在etcd上进行如下配置:('/atomic.io/network/config'这个key与上文/etc/sysconfig/flannel中的配置项FLANNEL_ETCD_PREFIX是相对应的,错误的话启动就会出错)

[root@k8s-master ~]# etcdctl rm /atomic.io/network/ --recursive

[root@k8s-master ~]# etcdctl mk /atomic.io/network/config '{ "Network": "10.10.0.0/16" }'

"Network""10.10.0.0/16" }

注:atomic.io可以更换为coreos.com

查看etcd配置中心网段

etcdctl ls /atomic.io/network/subnets  

 

4)启动Flannel

启动Flannel之后,需要依次重启docker、kubernete。

   

在master执行:

[root@k8s-master ~]# systemctl enable flanneld.service

[root@k8s-master ~]# systemctl start flanneld.service

[root@k8s-master ~]# service docker restart

[root@k8s-master ~]# systemctl restart kube-apiserver.service

[root@k8s-master ~]# systemctl restart kube-controller-manager.service

[root@k8s-master ~]# systemctl restart kube-scheduler.service

   

在node上执行:

[root@k8s-node-1 ~]# systemctl enable flanneld.service

[root@k8s-node-1 ~]# systemctl start flanneld.service

[root@k8s-node-1 ~]# service docker restart

[root@k8s-node-1 ~]# systemctl restart kubelet.service

[root@k8s-node-1 ~]# systemctl restart kube-proxy.service

  

然后通过ifconfig命令查看maste和node节点,发现docker0网桥网络的ip已经是上面指定的10.10.0.0网段了。并且在master和node节点上创建的容器间都是可以相互通信的,能相互ping通!

在master上执行:

[root@k8s-master ~]# ifconfig 

docker0: flags=4099  mtu 1500

        inet 10.10.34.1  netmask 255.255.255.0  broadcast 0.0.0.0

        ether 02:42:e1:c2:b5:88  txqueuelen 0  (Ethernet)

        RX packets 0  bytes 0 (0.0 B)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 0  bytes 0 (0.0 B)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

eth0: flags=4163  mtu 1500

        inet 10.10.172.202  netmask 255.255.255.0  broadcast 10.10.172.255

        inet6 fe80::250:56ff:fe86:6833  prefixlen 64  scopeid 0x20

        ether 00:50:56:86:68:33  txqueuelen 1000  (Ethernet)

        RX packets 87982  bytes 126277968 (120.4 MiB)

        RX errors 0  dropped 40  overruns 0  frame 0

        TX packets 47274  bytes 6240061 (5.9 MiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

flannel0: flags=4305  mtu 1472

        inet 10.10.34.0  netmask 255.255.0.0  destination 10.10.34.0

        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)

        RX packets 0  bytes 0 (0.0 B)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 0  bytes 0 (0.0 B)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

lo: flags=73  mtu 65536

        inet 127.0.0.1  netmask 255.0.0.0

        inet6 ::1  prefixlen 128  scopeid 0x10

        loop  txqueuelen 0  (Local Loopback)

        RX packets 91755  bytes 38359378 (36.5 MiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 91755  bytes 38359378 (36.5 MiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

[root@k8s-master ~]

在node上执行

[root@k8s-node-1 ~]# ifconfig 

docker0: flags=4099  mtu 1500

        inet 10.10.66.1  netmask 255.255.255.0  broadcast 0.0.0.0

        ether 02:42:2c:1d:19:14  txqueuelen 0  (Ethernet)

        RX packets 0  bytes 0 (0.0 B)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 0  bytes 0 (0.0 B)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

eth0: flags=4163  mtu 1500

        inet 10.10.172.203  netmask 255.255.255.0  broadcast 10.10.172.255

        inet6 fe80::250:56ff:fe86:3ed8  prefixlen 64  scopeid 0x20

        ether 00:50:56:86:3e:d8  txqueuelen 1000  (Ethernet)

        RX packets 69554  bytes 116340717 (110.9 MiB)

        RX errors 0  dropped 34  overruns 0  frame 0

        TX packets 35925  bytes 2949594 (2.8 MiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

flannel0: flags=4305  mtu 1472

        inet 10.10.66.0  netmask 255.255.0.0  destination 10.10.66.0

        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)

        RX packets 0  bytes 0 (0.0 B)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 0  bytes 0 (0.0 B)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

lo: flags=73  mtu 65536

        inet 127.0.0.1  netmask 255.0.0.0

        inet6 ::1  prefixlen 128  scopeid 0x10

        loop  txqueuelen 0  (Local Loopback)

        RX packets 24  bytes 1856 (1.8 KiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 24  bytes 1856 (1.8 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

[root@k8s-node-1 ~]

 

 

[root@k8s-node-2 ~]# ifconfig 

docker0: flags=4099  mtu 1500

        inet 10.10.59.1  netmask 255.255.255.0  broadcast 0.0.0.0

        ether 02:42:08:8b:65:48  txqueuelen 0  (Ethernet)

        RX packets 0  bytes 0 (0.0 B)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 0  bytes 0 (0.0 B)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

eth0: flags=4163  mtu 1500

        inet 10.10.172.204  netmask 255.255.255.0  broadcast 10.10.172.255

        inet6 fe80::250:56ff:fe86:22d8  prefixlen 64  scopeid 0x20

        ether 00:50:56:86:22:d8  txqueuelen 1000  (Ethernet)

        RX packets 69381  bytes 116036521 (110.6 MiB)

        RX errors 0  dropped 27  overruns 0  frame 0

        TX packets 35545  bytes 2943130 (2.8 MiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

flannel0: flags=4305  mtu 1472

        inet 10.10.59.0  netmask 255.255.0.0  destination 10.10.59.0

        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)

        RX packets 0  bytes 0 (0.0 B)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 0  bytes 0 (0.0 B)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

lo: flags=73  mtu 65536

        inet 127.0.0.1  netmask 255.0.0.0

        inet6 ::1  prefixlen 128  scopeid 0x10

        loop  txqueuelen 0  (Local Loopback)

        RX packets 24  bytes 1856 (1.8 KiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 24  bytes 1856 (1.8 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

[root@k8s-node-2 ~]#

6)部署nginx pod 和 复制 “器”

以下面的图来安装一个简单的静态内容的nginx应用:

 

用复制“器”启动一个2个备份的nginx Pod,然后在前面挂Service,一个service只能被集群内部访问,一个能被集群外的节点访问。下面所有的命令都是在master管理节点上运行的。

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

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

1)首先部署nginx pod 和复制“器”---------------------------------------------------------------------

  

[root@k8s-master ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/nginx     latest              3448f27c273f        8 days ago          109.4 MB

  

通过下面命令发现apiVersion版本是v1

[root@k8s-master ~]# curl -s -L http://10.10.172.202:8080/api/v1beta1/version | python -mjson.tool

{

    "apiVersion""v1",

    .......

}

  

开始创建pod单元

[root@k8s-master ~]# mkdir -p /data/kubermange && cd /data/kubermange

[root@k8s-master kubermange]# vim nginx-rc.yaml

apiVersion: v1

kind: ReplicationController

metadata:

  name: nginx-controller

spec:

  replicas: 2                              #即2个备份

  selector:

    name: nginx

  template:

    metadata:

      labels:

        name: nginx

    spec:

      containers:

        - name: nginx

          image: docker.io/nginx

          ports:

            - containerPort: 80

[root@k8s-master kubermange]# kubectl -s http://10.10.172.202:8080 create -f nginx-rc.yaml

replicationcontroller "nginx-controller" created

  

由于kubernetes要去gcr.io下载gcr.io/google_containers/pause镜像,然后下载nginx镜像,所以所创建的Pod需要等待一些时间才能处于running状态。

然后查看pods清单

[root@k8s-master kubermange]# kubectl -s http://k8s-master:8080 get pods

NAME                     READY     STATUS              RESTARTS   AGE

nginx-controller-3n1ct   0/1       ContainerCreating   0          8s

nginx-controller-4bnfn   0/1       ContainerCreating   0          8s

  

可以使用describe 命令查看pod所分到的节点:

[root@k8s-master kubermange]# kubectl -s http://10.10.172.202:8080 describe pod nginx-controller-3n1ct |more

Name:       nginx-controller-3n1ct

Namespace:  default

Node:       k8s-node-1/10.10.172.203

.......

  

同理,查看另一个pod

[root@k8s-master kubermange]# kubectl -s http://10.10.172.202:8080 describe pod nginx-controller-4bnfn |more

Name:       nginx-controller-4bnfn

Namespace:  default

Node:       k8s-node-2/10.10.172.204

.......

  

由上可以看出,这个复制“器”启动了两个Pod,分别运行在10.10.172.203和10.10.172.204这两个节点上了。到这两个节点上查看,发现已经有nginx应用容器创建了。

 

提醒:最好事先在node节点上执行命令yum install *rhsm* -y(yum install python-rhsm python-rhsm-certificates [python-dateutil] -y);然后执行命令docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest;最后执行命令kubectl -s http://10.10.172.202:8080 create -f nginx-rc.yaml来创建pod单元。

[root@k8s-node-1 ~]# docker images

REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE

docker.io/nginx                                       latest              3f8a4339aadd        12 days ago         108.5 MB

registry.access.redhat.com/rhel7/pod-infrastructure   latest              99965fb98423        12 weeks ago        208.6 MB

[root@k8s-node-1 ~]# docker ps

CONTAINER ID        IMAGE                                                        COMMAND                  CREATED             STATUS              PORTS               NAMES

e60877d9d5e4        docker.io/nginx                                              "nginx -g 'daemon off"   10 minutes ago      Up 10 minutes                           k8s_nginx.3d610115_nginx-controller-b05d6_default_aadfd74a-f43a-11e7-a1bf-005056866833_6de59c2d

cba61f9bda3b        registry.access.redhat.com/rhel7/pod-infrastructure:latest   "/usr/bin/pod"           11 minutes ago      Up 11 minutes                           k8s_POD.a8590b41_nginx-controller-b05d6_default_aadfd74a-f43a-11e7-a1bf-005056866833_e60a56ca

[root@k8s-node-1 ~]# docker inspect e60877d9d5e4 |grep -i ip

            "IpcMode""container:cba61f9bda3b9e68859098f16ae4c77c09189ace3b8dc4656b797f5dd7dcb615",

            "LinkLocalIPv6Address""",

            "LinkLocalIPv6PrefixLen": 0,

            "SecondaryIPAddresses": null,

            "SecondaryIPv6Addresses": null,

            "GlobalIPv6Address""",

            "GlobalIPv6PrefixLen": 0,

            "IPAddress""",

            "IPPrefixLen": 0,

            "IPv6Gateway""",

[root@k8s-node-1 ~]

 

[root@k8s-node-2 ~]# docker images

REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE

docker.io/nginx                                       latest              3f8a4339aadd        12 days ago         108.5 MB

registry.access.redhat.com/rhel7/pod-infrastructure   latest              99965fb98423        12 weeks ago        208.6 MB

[root@k8s-node-2 ~]# docker ps

CONTAINER ID        IMAGE                                                        COMMAND                  CREATED             STATUS              PORTS               NAMES

491df793c5d8        docker.io/nginx                                              "nginx -g 'daemon off"   12 minutes ago      Up 12 minutes                           k8s_nginx.3d610115_nginx-controller-8ddph_default_aadfcd91-f43a-11e7-a1bf-005056866833_785ceefb

647bf56d61b8        registry.access.redhat.com/rhel7/pod-infrastructure:latest   "/usr/bin/pod"           12 minutes ago      Up 12 minutes                           k8s_POD.a8590b41_nginx-controller-8ddph_default_aadfcd91-f43a-11e7-a1bf-005056866833_145d0863

[root@k8s-node-2 ~]# docker inspect 491df793c5d8 |grep -i ip

            "IpcMode""container:647bf56d61b8b46a01dbf422ab273a11aa36c6b38bce594d73bec1ac42068829",

            "LinkLocalIPv6Address""",

            "LinkLocalIPv6PrefixLen": 0,

            "SecondaryIPAddresses": null,

            "SecondaryIPv6Addresses": null,

            "GlobalIPv6Address""",

            "GlobalIPv6PrefixLen": 0,

            "IPAddress""",

            "IPPrefixLen": 0,

            "IPv6Gateway""",

[root@k8s-node-2 ~]

 

  

2)部署节点内部可访问的nginx service------------------------------------------------------------------------

Service的type有ClusterIP和NodePort之分,缺省是ClusterIP,这种类型的Service只能在集群内部访问。配置文件如下:

[root@k8s-master kubermange]# vim nginx-service-clusterip.yaml

apiVersion: v1

kind: Service

metadata:

  name: nginx-service-clusterip

spec:

  ports:

    - port: 8001

      targetPort: 80

      protocol: TCP

  selector:

    name: nginx

  

  

然后执行下面的命令创建service:

[root@k8s-master kubermange]# kubectl -s http://10.10.172.202:8080 create -f nginx-service-clusterip.yaml

或者

[root@k8s-master kubermange]# kubectl -s http://10.10.172.202:8080 create -f ./nginx-service-clusterip.yaml

service "nginx-service-clusterip" created

 

[root@k8s-master kubermange]# kubectl -s http://10.10.172.202:8080 get service

NAME                      CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE

kubernetes                192.168.21.1             443/TCP    2d

nginx-service-clusterip   192.168.21.174           8001/TCP   12s

  

验证service的可访问性(访问节点):

上面的输出告诉我们这个Service的Cluster IP是192.168.21.174,端口是8001。那么我们就来验证这个PortalNet IP的工作情况:

ssh登录到节点机上验证(可以提前做ssh无密码登录的信任关系,当然也可以不做,这样验证时要手动输入登录密码)          

[root@k8s-master kubermange]# ssh 10.10.172.203 curl -s 192.168.21.174:8001  //或者直接到节点机上执行"curl -s 192.168.21.174:8001"

The authenticity of host '10.10.172.203 (10.10.172.203)' can't be established.

ECDSA key fingerprint is 66:41:1f:d2:77:b6:eb:ce:3f:a1:68:47:7e:14:ee:cb.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '10.10.172.203' (ECDSA) to the list of known hosts.

[email protected]'s password: 

<head>

Welcome to nginx!<</code><code>/title</code><code>></code></p> <p><code><style></code></p> <p><code>    </code><code>body {</code></p> <p><code>        </code><code>width: 35em;</code></p> <p><code>        </code><code>margin: 0 auto;</code></p> <p><code>        </code><code>font-family: Tahoma, Verdana, Arial, sans-serif;</code></p> <p><code>    </code><code>}</code></p> <p><code><</code><code>/style</code><code>></code></p> <p><code><</code><code>/head</code><code>></code></p> <p><code><body></code></p> <p><code><h1>Welcome to nginx!<</code><code>/h1</code><code>></code></p> <p><code><p>If you see this page, the nginx web server is successfully installed and</code></p> <p><code>working. Further configuration is required.<</code><code>/p</code><code>></code></p> <p> </p> <p><code><p>For online documentation and support please refer to</code></p> <p><code><a href=</code><code>"http://nginx.org/"</code><code>>nginx.org<</code><code>/a</code><code>>.<br/></code></p> <p><code>Commercial support is available at</code></p> <p><code><a href=</code><code>"http://nginx.com/"</code><code>>nginx.com<</code><code>/a</code><code>>.<</code><code>/p</code><code>></code></p> <p> </p> <p><code><p><em>Thank you </code><code>for</code> <code>using nginx.<</code><code>/em</code><code>><</code><code>/p</code><code>></code></p> <p><code><</code><code>/body</code><code>></code></p> <p><code><</code><code>/html</code><code>></code></p> <p><code>[root@k8s-master kubermange]</code><code># </code></p> <p> </p> <p><code> </code> </p> <p><code>同理验证到另外一个节点机上的service的可访问性也是ok的</code></p> <p><code>[root@k8s-master kubermange]</code><code># ssh 10.10.172.204 curl -s 192.168.21.174:8001</code></p> <p><code> </code> </p> <p><code>由此可见,从前面部署×××的部分可以知道nginx Pod运行在10.10.172.203和10.10.172.204这两个节点上。</code></p> <p><code>从这两个节点上访问我们的服务来体现Service Cluster IP在所有集群节点的可到达性。</code></p> <p><code> </code> </p> <p><code>3)部署外部可访问的nginx service-------------------------------------------------------------------</code></p> <p><code>下面我们创建NodePort类型的Service,这种类型的Service在集群外部是可以访问。下表是本文用的配置文件:</code></p> <p><code>[root@k8s-master kubermange]</code><code># vim nginx-service-nodeport.yaml</code></p> <p><code>apiVersion: v1</code></p> <p><code>kind: Service</code></p> <p><code>metadata:</code></p> <p><code>  </code><code>name: nginx-service-nodeport</code></p> <p><code>spec:</code></p> <p><code>  </code><code>ports:</code></p> <p><code>    </code><code>- port: 8000</code></p> <p><code>      </code><code>targetPort: 80</code></p> <p><code>      </code><code>protocol: TCP</code></p> <p><code>  </code><code>type</code><code>: NodePort</code></p> <p><code>  </code><code>selector:</code></p> <p><code>    </code><code>name: nginx</code></p> <p><code> </code> </p> <p><code> </code> </p> <p><code>执行下面的命令创建service:</code></p> <p><code>[root@k8s-master kubermange]</code><code># kubectl -s http://10.10.172.202:8080 create -f ./nginx-service-nodeport.yaml </code></p> <p><code>service </code><code>"nginx-service-nodeport"</code> <code>created</code></p> <p><code>[root@k8s-master kubermange]</code><code># kubectl -s http://10.10.172.202:8080 get service</code></p> <p><code>NAME                      CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE</code></p> <p><code>kubernetes                192.168.21.1     <none>        443</code><code>/TCP</code>          <code>2d</code></p> <p><code>nginx-service-clusterip   192.168.21.174   <none>        8001</code><code>/TCP</code>         <code>27m</code></p> <p><code>nginx-service-nodeport    192.168.21.140   <nodes>       8000:31099</code><code>/TCP</code>   <code>13s</code></p> <p><code> </code> </p> <p><code>使用下面的命令获得这个service的节点级别的端口:</code></p> <p><code>[root@k8s-master kubermange]</code><code># kubectl -s http://10.10.172.202:8080 describe service nginx-service-nodeport 2>/dev/null | grep NodePort</code></p> <p><code>Type:           NodePort</code></p> <p><code>NodePort:       <</code><code>unset</code><code>>   31099</code><code>/TCP</code></p> <p><code> </code> </p> <p><code>验证service的可访问性(访问节点):</code></p> <p><code>上面的输出告诉我们这个Service的节点级别端口是31099。下面我们验证这个Service的工作情况:</code></p> <p><code>[root@k8s-master kubermange]</code><code># curl 10.10.172.203:31099</code></p> <p><code><!DOCTYPE html></code></p> <p><code><html></code></p> <p><code><</code><code>head</code><code>></code></p> <p><code><title>Welcome to nginx!<</code><code>/title</code><code>></code></p> <p><code><style></code></p> <p><code>    </code><code>body {</code></p> <p><code>        </code><code>width: 35em;</code></p> <p><code>        </code><code>margin: 0 auto;</code></p> <p><code>        </code><code>font-family: Tahoma, Verdana, Arial, sans-serif;</code></p> <p><code>    </code><code>}</code></p> <p><code><</code><code>/style</code><code>></code></p> <p><code><</code><code>/head</code><code>></code></p> <p><code><body></code></p> <p><code><h1>Welcome to nginx!<</code><code>/h1</code><code>></code></p> <p><code><p>If you see this page, the nginx web server is successfully installed and</code></p> <p><code>working. Further configuration is required.<</code><code>/p</code><code>></code></p> <p> </p> <p><code><p>For online documentation and support please refer to</code></p> <p><code><a href=</code><code>"http://nginx.org/"</code><code>>nginx.org<</code><code>/a</code><code>>.<br/></code></p> <p><code>Commercial support is available at</code></p> <p><code><a href=</code><code>"http://nginx.com/"</code><code>>nginx.com<</code><code>/a</code><code>>.<</code><code>/p</code><code>></code></p> <p> </p> <p><code><p><em>Thank you </code><code>for</code> <code>using nginx.<</code><code>/em</code><code>><</code><code>/p</code><code>></code></p> <p><code><</code><code>/body</code><code>></code></p> <p><code><</code><code>/html</code><code>></code></p> <p><code>[root@k8s-master kubermange]</code><code># </code></p> <p><code> </code> </p> <p><code>同理验证到另外一个节点机上的service的可访问性也是ok的</code></p> <p><code>[root@k8s-master kubermange]</code><code># curl 10.10.172.204:31099</code></p> <p><code> </code> </p> <p><code>----------------------------------------------------------</code></p> <p><code>登录另外两个节点机上,发现已经创建了nginx应用容器</code></p> <p><code>[root@k8s-node-1 ~]</code><code># docker ps</code></p> <p><code>CONTAINER ID        IMAGE                                                        COMMAND                  CREATED             STATUS              PORTS               NAMES</code></p> <p><code>e60877d9d5e4        docker.io</code><code>/nginx</code>                                              <code>"nginx -g 'daemon off"</code>   <code>About an hour ago   Up About an hour                        k8s_nginx.3d610115_nginx-controller-b05d6_default_aadfd74a-f43a-11e7-a1bf-005056866833_6de59c2d</code></p> <p><code>cba61f9bda3b        registry.access.redhat.com</code><code>/rhel7/pod-infrastructure</code><code>:latest   </code><code>"/usr/bin/pod"</code>           <code>About an hour ago   Up About an hour                        k8s_POD.a8590b41_nginx-controller-b05d6_default_aadfd74a-f43a-11e7-a1bf-005056866833_e60a56ca</code></p> <p> </p> <p><code>CONTAINER ID        IMAGE                                                        COMMAND                  CREATED             STATUS              PORTS               NAMES</code></p> <p><code>491df793c5d8        docker.io</code><code>/nginx</code>                                              <code>"nginx -g 'daemon off"</code>   <code>About an hour ago   Up About an hour                        k8s_nginx.3d610115_nginx-controller-8ddph_default_aadfcd91-f43a-11e7-a1bf-005056866833_785ceefb</code></p> <p><code>647bf56d61b8        registry.access.redhat.com</code><code>/rhel7/pod-infrastructure</code><code>:latest   </code><code>"/usr/bin/pod"</code>           <code>About an hour ago   Up About an hour                        k8s_POD.a8590b41_nginx-controller-8ddph_default_aadfcd91-f43a-11e7-a1bf-005056866833_145d0863</code></p> </td> </tr> </tbody> </table> <p>谷歌浏览器访问测试:</p> <p></p> <p> </p> <p> </p> <p></p> <p> </p> <p> </p> <p>--------------------------------------------------------------------------------------------------------------</p> <table border="0"> <tbody> <tr> <td> <p>1</p> <p>2</p> <p>3</p> <p>4</p> <p>5</p> <p>6</p> <p>7</p> <p>8</p> <p>9</p> <p>10</p> <p>11</p> <p>12</p> <p>13</p> <p>14</p> <p>15</p> <p>16</p> <p>17</p> <p>18</p> <p>19</p> <p>20</p> <p>21</p> <p>22</p> <p>23</p> <p>24</p> <p>25</p> <p>26</p> <p>27</p> <p>28</p> <p>29</p> <p>30</p> <p>31</p> <p>32</p> <p>33</p> <p>34</p> <p>35</p> <p>36</p> <p>37</p> <p>38</p> <p>39</p> <p>40</p> <p>41</p> <p>42</p> <p>43</p> <p>44</p> <p>45</p> <p>46</p> <p>47</p> <p>48</p> <p>49</p> <p>50</p> <p>51</p> <p>52</p> <p>53</p> <p>54</p> <p>55</p> <p>56</p> <p>57</p> <p>58</p> <p>59</p> <p>60</p> <p>61</p> <p>62</p> <p>63</p> </td> <td> <p><code>1)可以扩容nginx应用容器,依次添加对应的应用容器的pod、service-clusterip、service-nodeport的yaml文件即可。</code></p> <p><code>注意yaml文件中的name名。</code></p> <p><code> </code> </p> <p><code>2)当然也可以添加其他应用容器,比如tomcat,也是依次创建pod、service-clusterip、service-nodeport的yaml文件。</code></p> <p><code>注意yaml文件中的name名和port端口不要重复</code></p> <p><code> </code> </p> <p><code>3)后面应用容器的集群环境完成后(外部可访问的端口是固定的),可以考虑做下master控制机的集群环境(即做etcd集群)。</code></p> <p><code>可以在控制节点做负载均衡,还可以通过keepalived做高可用。</code></p> <p><code> </code> </p> <p><code>---------------------------------------------------------</code></p> <p><code>下面是tomcat应用容器创建实例中的3个yaml文件</code></p> <p><code>[root@k8s-master kubermange]</code><code># cat tomcat-rc.yaml</code></p> <p><code>apiVersion: v1</code></p> <p><code>kind: ReplicationController</code></p> <p><code>metadata:</code></p> <p><code>  </code><code>name: tomcat-controller</code></p> <p><code>spec:</code></p> <p><code>  </code><code>replicas: 2                             </code></p> <p><code>  </code><code>selector:</code></p> <p><code>    </code><code>name: tomcat</code></p> <p><code>  </code><code>template:</code></p> <p><code>    </code><code>metadata:</code></p> <p><code>      </code><code>labels:</code></p> <p><code>        </code><code>name: tomcat</code></p> <p><code>    </code><code>spec:</code></p> <p><code>      </code><code>containers:</code></p> <p><code>        </code><code>- name: tomcat</code></p> <p><code>          </code><code>image: docker.io</code><code>/tomcat</code></p> <p><code>          </code><code>ports:</code></p> <p><code>            </code><code>- containerPort: 8080</code></p> <p><code> </code> </p> <p><code>[root@k8s-master kubermange]</code><code># cat tomcat-service-clusterip.yaml</code></p> <p><code>apiVersion: v1</code></p> <p><code>kind: Service</code></p> <p><code>metadata:</code></p> <p><code>  </code><code>name: tomcat-service-clusterip</code></p> <p><code>spec:</code></p> <p><code>  </code><code>ports:</code></p> <p><code>    </code><code>- port: 8801</code></p> <p><code>      </code><code>targetPort: 8080</code></p> <p><code>      </code><code>protocol: TCP</code></p> <p><code>  </code><code>selector:</code></p> <p><code>    </code><code>name: tomcat</code></p> <p><code> </code> </p> <p><code>[root@k8s-master kubermange]</code><code># cat tomcat-service-nodeport.yaml</code></p> <p><code>apiVersion: v1</code></p> <p><code>kind: Service</code></p> <p><code>metadata:</code></p> <p><code>  </code><code>name: tomcat-service-nodeport</code></p> <p><code>spec:</code></p> <p><code>  </code><code>ports:</code></p> <p><code>    </code><code>- port: 8880</code></p> <p><code>      </code><code>targetPort: 8080</code></p> <p><code>      </code><code>protocol: TCP</code></p> <p><code>  </code><code>type</code><code>: NodePort</code></p> <p><code>  </code><code>selector:</code></p> <p><code>    </code><code>name: tomcat</code></p> <p><code> </code> </p> <p><code> </code> </p> <p><code>查看外部可访问的tomcat service的端口</code></p> <p><code>[root@k8s-master kubermange]</code><code># kubectl -s http://10.10.172.202:8080 describe service tomcat-service-nodeport 2>/dev/null | grep NodePort</code></p> <p><code>Type:     NodePort</code></p> <p><code>NodePort:   <</code><code>unset</code><code>> 32295</code><code>/TCP</code></p> </td> </tr> </tbody> </table> <table border="0"> <tbody> <tr> <td> <p>1</p> <p>2</p> <p>3</p> <p>4</p> <p>5</p> <p>6</p> <p>7</p> <p>8</p> <p>9</p> <p>10</p> <p>11</p> <p>12</p> <p>13</p> <p>14</p> </td> <td> <p><code>操作步骤如下:</code></p> <p><code>1)首先部署tomcat pod 和 复制“器”</code></p> <p><code>[root@k8s-master kubermange]</code><code># kubectl -s http://10.10.172.202:8080 create -f tomcat-rc.yaml</code></p> <p><code>[root@k8s-master kubermange]</code><code># kubectl -s http://k8s-master:8080 get pods</code></p> <p><code>[root@k8s-master kubermange]</code><code># kubectl -s http://10.10.172.202:8080 describe pod nginx-controller-* |more</code></p> <p> </p> <p><code>2)部署节点内部可访问的tomcat service</code></p> <p><code>[root@k8s-master kubermange]</code><code># kubectl -s http://10.10.172.202:8080 create -f tomcat-service-clusterip.yaml</code></p> <p><code>[root@k8s-master kubermange]</code><code># kubectl -s http://10.10.172.202:8080 get service</code></p> <p> </p> <p><code>3)部署外部可访问的tomcat service</code></p> <p><code>[root@k8s-master kubermange]</code><code># kubectl -s http://10.10.172.202:8080 create -f ./tomcat-service-nodeport.yaml</code></p> <p><code>[root@k8s-master kubermange]</code><code># kubectl -s http://10.10.172.202:8080 get service</code></p> <p><code>[root@k8s-master kubermange]</code><code># kubectl -s http://10.10.172.202:8080 describe service tomcat-service-nodeport 2>/dev/null | grep NodePort</code></p> </td> </tr> </tbody> </table> <p>谷歌浏览器访问测试:</p> <p> </p> <p> </p> <p></p> <p> </p> <p></p> <p> </p> <p>到此为止,我们在每个节点上分别部署了nginx和tomcat容器。</p> <p> </p> <p><strong>总结:只需要node节点安装所有镜像即可,master节点不承担虚拟机docker安装可选。</strong></p> <table border="0"> <tbody> <tr> <td> <p>1</p> <p>2</p> <p>3</p> <p>4</p> <p>5</p> <p>6</p> <p>7</p> <p>8</p> <p>9</p> <p>10</p> <p>11</p> <p>12</p> <p>13</p> <p>14</p> <p>15</p> <p>16</p> <p>17</p> <p>18</p> <p>19</p> <p>20</p> <p>21</p> <p>22</p> <p>23</p> <p>24</p> <p>25</p> <p>26</p> <p>27</p> <p>28</p> <p>29</p> <p>30</p> <p>31</p> <p>32</p> </td> <td> <p><code>[root@k8s-master ~]</code><code># docker images</code></p> <p><code>REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE</code></p> <p><code>docker.io</code><code>/nginx</code>     <code>latest              3f8a4339aadd        12 days ago         108.5 MB</code></p> <p><code>[root@k8s-master ~]</code><code># docker ps</code></p> <p><code>CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES</code></p> <p><code>[root@k8s-master ~]</code><code># </code></p> <p> </p> <p><code>[root@k8s-node-1 ~]</code><code># docker images</code></p> <p><code>REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE</code></p> <p><code>docker.io</code><code>/nginx</code>                                       <code>latest              3f8a4339aadd        12 days ago         108.5 MB</code></p> <p><code>docker.io</code><code>/tomcat</code>                                      <code>latest              3dcfe809147d        3 weeks ago         557.4 MB</code></p> <p><code>registry.access.redhat.com</code><code>/rhel7/pod-infrastructure</code>   <code>latest              99965fb98423        12 weeks ago        208.6 MB</code></p> <p><code>[root@k8s-node-1 ~]</code><code># docker ps</code></p> <p><code>CONTAINER ID        IMAGE                                                        COMMAND                  CREATED             STATUS              PORTS               NAMES</code></p> <p><code>a30873206f1a        docker.io</code><code>/tomcat</code>                                             <code>"catalina.sh run"</code>        <code>23 minutes ago      Up 23 minutes                           k8s_tomcat.cdbc0245_tomcat-controller-9dm45_default_07397545-f448-11e7-a1bf-005056866833_d753af9d</code></p> <p><code>967e614e667b        registry.access.redhat.com</code><code>/rhel7/pod-infrastructure</code><code>:latest   </code><code>"/usr/bin/pod"</code>           <code>25 minutes ago      Up 25 minutes                           k8s_POD.24f70ba9_tomcat-controller-9dm45_default_07397545-f448-11e7-a1bf-005056866833_46708437</code></p> <p><code>e60877d9d5e4        docker.io</code><code>/nginx</code>                                              <code>"nginx -g 'daemon off"</code>   <code>2 hours ago         Up 2 hours                              k8s_nginx.3d610115_nginx-controller-b05d6_default_aadfd74a-f43a-11e7-a1bf-005056866833_6de59c2d</code></p> <p><code>cba61f9bda3b        registry.access.redhat.com</code><code>/rhel7/pod-infrastructure</code><code>:latest   </code><code>"/usr/bin/pod"</code>           <code>2 hours ago         Up 2 hours                              k8s_POD.a8590b41_nginx-controller-b05d6_default_aadfd74a-f43a-11e7-a1bf-005056866833_e60a56ca</code></p> <p><code>[root@k8s-node-1 ~]</code><code># </code></p> <p> </p> <p><code>[root@k8s-node-2 ~]</code><code># docker images</code></p> <p><code>REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE</code></p> <p><code>docker.io</code><code>/nginx</code>                                       <code>latest              3f8a4339aadd        12 days ago         108.5 MB</code></p> <p><code>docker.io</code><code>/tomcat</code>                                      <code>latest              3dcfe809147d        3 weeks ago         557.4 MB</code></p> <p><code>registry.access.redhat.com</code><code>/rhel7/pod-infrastructure</code>   <code>latest              99965fb98423        12 weeks ago        208.6 MB</code></p> <p><code>[root@k8s-node-2 ~]</code><code># docker ps</code></p> <p><code>CONTAINER ID        IMAGE                                                        COMMAND                  CREATED             STATUS              PORTS               NAMES</code></p> <p><code>18b91f21a691        docker.io</code><code>/tomcat</code>                                             <code>"catalina.sh run"</code>        <code>24 minutes ago      Up 24 minutes                           k8s_tomcat.cdbc0245_tomcat-controller-2b17b_default_07395f07-f448-11e7-a1bf-005056866833_de861f22</code></p> <p><code>5bfe2ec09a0a        registry.access.redhat.com</code><code>/rhel7/pod-infrastructure</code><code>:latest   </code><code>"/usr/bin/pod"</code>           <code>25 minutes ago      Up 25 minutes                           k8s_POD.24f70ba9_tomcat-controller-2b17b_default_07395f07-f448-11e7-a1bf-005056866833_69dd72ef</code></p> <p><code>491df793c5d8        docker.io</code><code>/nginx</code>                                              <code>"nginx -g 'daemon off"</code>   <code>2 hours ago         Up 2 hours                              k8s_nginx.3d610115_nginx-controller-8ddph_default_aadfcd91-f43a-11e7-a1bf-005056866833_785ceefb</code></p> <p><code>647bf56d61b8        registry.access.redhat.com</code><code>/rhel7/pod-infrastructure</code><code>:latest   </code><code>"/usr/bin/pod"</code>           <code>2 hours ago         Up 2 hours                              k8s_POD.a8590b41_nginx-controller-8ddph_default_aadfcd91-f43a-11e7-a1bf-005056866833_145d0863</code></p> <p><code>[root@k8s-node-2 ~]</code><code>#</code></p> </td> </tr> </tbody> </table> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1188613545621823488"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(kubernetes集群搭建)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1943991135068286976.htm" title="k8s:安装 Helm 私有仓库ChartMuseum、helm-push插件并上传、安装Zookeeper" target="_blank">k8s:安装 Helm 私有仓库ChartMuseum、helm-push插件并上传、安装Zookeeper</a> <span class="text-muted">云游</span> <a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/helm/1.htm">helm</a><a class="tag" taget="_blank" href="/search/helm-push/1.htm">helm-push</a> <div>ChartMuseum是Kubernetes生态中用于存储、管理和发布HelmCharts的开源系统,主要用于扩展Helm包管理器的功能核心功能‌集中存储‌:提供中央化仓库存储Charts,支持版本管理和权限控制。‌‌跨集群部署‌:支持多集群环境下共享Charts,简化部署流程。‌‌离线部署‌:适配无网络环境,可将Charts存储在本地或局域网内。‌‌HTTP接口‌:通过HTTP协议提供服务,用户</div> </li> <li><a href="/article/1943920919063883776.htm" title="Kubernetes自动扩缩容方案对比与实践指南" target="_blank">Kubernetes自动扩缩容方案对比与实践指南</a> <span class="text-muted">浅沫云归</span> <a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF%E6%8A%80%E6%9C%AF%E6%A0%88%E5%B0%8F%E7%BB%93/1.htm">后端技术栈小结</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/autoscaling/1.htm">autoscaling</a><a class="tag" taget="_blank" href="/search/devops/1.htm">devops</a> <div>Kubernetes自动扩缩容方案对比与实践指南随着微服务架构和容器化的广泛采用,Kubernetes自动扩缩容(Autoscaling)成为保障生产环境性能稳定与资源高效利用的关键技术。面对水平Pod扩缩容、垂直资源调整、集群节点扩缩容以及事件驱动扩缩容等多种需求,社区提供了HPA、VPA、ClusterAutoscaler、KEDA等多种方案。本篇文章将从业务背景、方案对比、优缺点分析、选型建</div> </li> <li><a href="/article/1943919279413981184.htm" title="【运维实战】解决 K8s 节点无法拉取 pause:3.6 镜像导致 API Server 启动失败的问题" target="_blank">【运维实战】解决 K8s 节点无法拉取 pause:3.6 镜像导致 API Server 启动失败的问题</a> <span class="text-muted">gs80140</span> <a class="tag" taget="_blank" href="/search/%E5%90%84%E7%A7%8D%E9%97%AE%E9%A2%98/1.htm">各种问题</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a> <div>目录【运维实战】解决K8s节点无法拉取pause:3.6镜像导致APIServer启动失败的问题问题分析✅解决方案:替代拉取方式导入pause镜像Step1.从私有仓库拉取pause镜像Step2.重新打tag为Kubernetes默认命名Step3.导出镜像为tar包Step4.拷贝镜像到目标节点Step5.在目标节点导入镜像到containerd的k8s.io命名空间Step6.验证镜像是否导</div> </li> <li><a href="/article/1943914485504864256.htm" title="zookeeper etcd区别" target="_blank">zookeeper etcd区别</a> <span class="text-muted">sun007700</span> <a class="tag" taget="_blank" href="/search/zookeeper/1.htm">zookeeper</a><a class="tag" taget="_blank" href="/search/etcd/1.htm">etcd</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a> <div>ZooKeeper与etcd的核心区别体现在设计理念、数据模型、一致性协议及适用场景等方面。‌ZooKeeper基于ZAB协议实现分布式协调,采用树形数据结构和临时节点特性,适合传统分布式系统;而etcd基于Raft协议,以高性能键值对存储为核心,专为云原生场景优化,是Kubernetes等容器编排系统的默认存储组件。‌‌1‌‌2‌架构与设计目标差异‌‌ZooKeeper‌。‌设计定位‌:专注于分</div> </li> <li><a href="/article/1943878433524215808.htm" title="在 Linux(openEuler 24.03 LTS-SP1)上安装 Kubernetes + KubeSphere 的防火墙放行全攻略" target="_blank">在 Linux(openEuler 24.03 LTS-SP1)上安装 Kubernetes + KubeSphere 的防火墙放行全攻略</a> <span class="text-muted"></span> <div>目录在Linux(openEuler24.03LTS-SP1)上安装Kubernetes+KubeSphere的防火墙放行全攻略一、为什么要先搞定防火墙?二、目标环境三、需放行的端口和协议列表四、核心工具说明1.修正后的exec.sh脚本(支持管道/重定向)2.批量放行脚本:open_firewall.sh五、使用示例1.批量放行端口2.查看当前防火墙规则3.仅开放单一端口(临时需求)4.检查特定</div> </li> <li><a href="/article/1943774787104993280.htm" title="K3s-io/kine项目核心架构与数据流解析" target="_blank">K3s-io/kine项目核心架构与数据流解析</a> <span class="text-muted">富珂祯</span> <div>K3s-io/kine项目核心架构与数据流解析kineRunKubernetesonMySQL,Postgres,sqlite,dqlite,notetcd.项目地址:https://gitcode.com/gh_mirrors/ki/kine项目概述K3s-io/kine是一个创新的存储适配器,它在传统SQL数据库之上实现了轻量级的键值存储功能。该项目最显著的特点是采用单一数据表结构,通过巧妙的</div> </li> <li><a href="/article/1943762687385202688.htm" title="20250707-3-Kubernetes 核心概念-有了Docker,为什么还用K8s_笔记" target="_blank">20250707-3-Kubernetes 核心概念-有了Docker,为什么还用K8s_笔记</a> <span class="text-muted">Andy杨</span> <a class="tag" taget="_blank" href="/search/CKA-%E4%B8%93%E6%A0%8F/1.htm">CKA-专栏</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a> <div>一、Kubernetes核心概念1.有了Docker,为什么还用Kubernetes1)企业需求独立性问题:Docker容器本质上是独立存在的,多个容器跨主机提供服务时缺乏统一管理机制负载均衡需求:为提高业务并发和高可用,企业会使用多台服务器部署多个容器实例,但Docker本身不具备负载均衡能力管理复杂度:随着Docker主机和容器数量增加,面临部署、升级、监控等统一管理难题运维效率:单机升</div> </li> <li><a href="/article/1943758776741982208.htm" title="20250707-4-Kubernetes 集群部署、配置和验证-K8s基本资源概念初_笔记" target="_blank">20250707-4-Kubernetes 集群部署、配置和验证-K8s基本资源概念初_笔记</a> <span class="text-muted"></span> <div>一、kubeconfig配置文件文件作用:kubectl使用kubeconfig认证文件连接K8s集群生成方式:使用kubectlconfig指令生成核心字段:clusters:定义集群信息,包括证书和服务端地址contexts:定义上下文,关联集群和用户users:定义客户端认证信息current-context:指定当前使用的上下文二、Kubernetes弃用Docker1.弃用背景原因:</div> </li> <li><a href="/article/1943755374930751488.htm" title="k8s之configmap" target="_blank">k8s之configmap</a> <span class="text-muted">西京刀客</span> <a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F%28Cloud/1.htm">云原生(Cloud</a><a class="tag" taget="_blank" href="/search/Native%29/1.htm">Native)</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E8%AE%A1%E7%AE%97/1.htm">云计算</a><a class="tag" taget="_blank" href="/search/%E8%99%9A%E6%8B%9F%E5%8C%96/1.htm">虚拟化</a><a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Kubernetes%28k8s%29/1.htm">Kubernetes(k8s)</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a> <div>文章目录k8s之configmap什么是ConfigMap?为什么需要ConfigMap?ConfigMap的创建方式ConfigMap的使用方式实际应用场景ConfigMap最佳实践参考k8s之configmap什么是ConfigMap?ConfigMap是Kubernetes中用于存储非机密配置数据的API对象。它允许你将配置信息与容器镜像解耦,使应用程序更加灵活和可移植。ConfigMap以</div> </li> <li><a href="/article/1943718693351518208.htm" title="SkyWalking实现微服务链路追踪的埋点方案" target="_blank">SkyWalking实现微服务链路追踪的埋点方案</a> <span class="text-muted">MenzilBiz</span> <a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E5%BE%AE%E6%9C%8D%E5%8A%A1/1.htm">微服务</a><a class="tag" taget="_blank" href="/search/skywalking/1.htm">skywalking</a> <div>SkyWalking实现微服务链路追踪的埋点方案一、SkyWalking简介SkyWalking是一款开源的APM(应用性能监控)系统,特别为微服务、云原生架构和容器化(Docker/Kubernetes)应用而设计。它主要功能包括分布式追踪、服务网格遥测分析、指标聚合和可视化等。SkyWalking支持多种语言(Java、Go、Python等)和协议(HTTP、gRPC等),能够提供端到端的调用</div> </li> <li><a href="/article/1943620742079901696.htm" title="Kubernetes 高级调度 01" target="_blank">Kubernetes 高级调度 01</a> <span class="text-muted">惊起白鸽450</span> <a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a> <div>一、初始化容器(InitContainer):应用启动前的"预备军"在Kubernetes集群中,Pod作为最小部署单元,往往需要在主容器启动前完成一系列准备工作。例如,配置文件生成、依赖服务检查、内核参数调整等。这些操作若直接嵌入主容器镜像,会导致镜像体积膨胀、安全性降低,甚至引发启动逻辑混乱。初始化容器(InitContainer)的出现,正是为了解决这一痛点。1.1核心概念与特性InitCo</div> </li> <li><a href="/article/1943558970039922688.htm" title="43.商城系统(二十四):kubernate基础架构,集群搭建" target="_blank">43.商城系统(二十四):kubernate基础架构,集群搭建</a> <span class="text-muted">鹏哥哥啊Aaaa</span> <a class="tag" taget="_blank" href="/search/%E4%BB%8E%E5%A4%B4%E5%BC%80%E5%A7%8B%E5%81%9A%E9%A1%B9%E7%9B%AE/1.htm">从头开始做项目</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a> <div>目录一、为什么要用k8s1.不同时代的部署2.k8s的特点二、k8s的基本架构1.整体架构2.主节点架构3.node节点4.整体流程三、K8S集群搭建1.先克隆三个虚拟机2.设置NAT网络3.配置虚拟机前置环境4.安装Docker、kubeadm、kubelet、kubectl(1)安装docker(2)添加阿里云yum源(3)安装kubeadm,kubelet和kubectl5.部署k8s-ma</div> </li> <li><a href="/article/1943462011966910464.htm" title="# 深度解析:k8s技术架构从入门到精通" target="_blank"># 深度解析:k8s技术架构从入门到精通</a> <span class="text-muted"></span> <div>从零开始,带你玩转Kubernetes!不再是"听说很牛逼,但不知道怎么用"的状态文章目录初识K8s:不只是一个"容器编排工具"K8s核心架构:Master和Node的"君臣关系"ControlPlane:大脑中枢的精密运作WorkerNode:真正干活的"打工人"Pod:K8s世界的最小单位Service:让应用"找得到彼此"实战场景:从单体到微服务的华丽转身进阶之路:从入门到精通的修炼指南总结</div> </li> <li><a href="/article/1943432902486323200.htm" title="3-2-1、k8s学习-k8s介绍" target="_blank">3-2-1、k8s学习-k8s介绍</a> <span class="text-muted">向新35°</span> <a class="tag" taget="_blank" href="/search/%E4%B8%80/1.htm">一</a><a class="tag" taget="_blank" href="/search/be/1.htm">be</a><a class="tag" taget="_blank" href="/search/a/1.htm">a</a><a class="tag" taget="_blank" href="/search/K8s/1.htm">K8s</a><a class="tag" taget="_blank" href="/search/God/1.htm">God</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a> <div>1、Kubernetes(K8s)详细介绍一、Kubernetes概述Kubernetes是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。其名称源于希腊语,意为“舵手”或“飞行员”,象征着对容器化应用的精准控制。核心目标:简化微服务架构下的应用部署与管理,解决容器化应用的服务发现、负载均衡、自动扩缩容、故障恢复等问题。起源:由Google开发(基于内部Borg系统),2014年</div> </li> <li><a href="/article/1943407690722111488.htm" title="【ubuntu24.04】k8s 部署6:calico容器正常启动" target="_blank">【ubuntu24.04】k8s 部署6:calico容器正常启动</a> <span class="text-muted">等风来不如迎风去</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E6%9C%8D%E5%8A%A1%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E6%88%98/1.htm">网络服务入门与实战</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a> <div>参考大神以及tigera官方的calico教程:拥有一个带有Calico的单主机Kubernetes集群后,【k8s】配置calico1:镜像拉取【k8s】master节点重新安装docker-ce本文进一步解决容器启动问题:非常感谢大神的指点:准备Kubernetes集群环境做好了各种配置以后,kube**的镜像起始</div> </li> <li><a href="/article/1943381101112258560.htm" title="云原生周刊:Istio 1.24.0 正式发布" target="_blank">云原生周刊:Istio 1.24.0 正式发布</a> <span class="text-muted"></span> <div>云原生周刊:Istio1.24.0正式发布开源项目推荐KopfKopf是一个简洁高效的Python框架,只需几行代码即可编写KubernetesOperator。Kubernetes(K8s)作为强大的容器编排系统,虽自带命令行工具(kubectl),但在应对复杂操作时往往力不从心。通过Kopf,您可以使用Python轻松实现Kubernetes的复杂操作,包括条件判断、事件触发等,让自定义操作变</div> </li> <li><a href="/article/1943373286167605248.htm" title="异构推理系统动态负载调度与资源分配实战:多节点协同、任务绑定与智能分发策略全解析" target="_blank">异构推理系统动态负载调度与资源分配实战:多节点协同、任务绑定与智能分发策略全解析</a> <span class="text-muted">观熵</span> <a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E9%AB%98%E9%98%B6%E4%BC%98%E5%8C%96%E6%8A%80%E6%9C%AF%E4%B8%93%E9%A2%98/1.htm">大模型高阶优化技术专题</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>异构推理系统动态负载调度与资源分配实战:多节点协同、任务绑定与智能分发策略全解析关键词异构调度、Kubernetes调度器、GPU任务绑定、MIG分配、推理流量调度、服务亲和性、任务隔离、资源优先级、边缘协同、动态算力管理摘要在AI推理系统的生产级部署中,单一自动扩缩容机制已无法满足实际复杂环境中对资源利用率、任务延迟与系统稳定性的多重要求。特别是在GPU/NPU/CPU并存的异构计算集群中,运行</div> </li> <li><a href="/article/1943351726010593280.htm" title="Kubernetes 配置管理" target="_blank">Kubernetes 配置管理</a> <span class="text-muted">伤不起bb</span> <a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a> <div>目录前言:为什么需要K8s配置管理?一、为什么需要ConfigMap和Secret?二、ConfigMap:非敏感配置的管理工具1.什么是ConfigMap?2.实战:创建ConfigMap的4种方式①基于目录创建(多文件批量导入)②基于单个文件创建(指定key名)③基于ENV文件创建(key=value格式)④基于命令行键值对创建(少量配置)3.实战:在Pod中使用ConfigMap①作为环境变</div> </li> <li><a href="/article/1943314284062765056.htm" title="深度解析:SUSE Harvester私有云平台建设指南" target="_blank">深度解析:SUSE Harvester私有云平台建设指南</a> <span class="text-muted"></span> <div>关键词:SUSEHarvester,私有云,HCI,超融合,Kubernetes,KubeVirt,Longhorn,云原生,虚拟化,容器目录导航一、初识SUSEHarvester-私有云的新选择二、核心架构解析-揭开HCI的神秘面纱三、部署实战-从零到一搭建你的私有云四、存储与网络配置-数据的安全港湾五、虚拟机管理-让资源调度更智能六、监控与运维-保驾护航的守护者七、最佳实践-踩坑经验分享八、总</div> </li> <li><a href="/article/1943296625275367424.htm" title="Spring Boot:将应用部署到Kubernetes的完整指南" target="_blank">Spring Boot:将应用部署到Kubernetes的完整指南</a> <span class="text-muted">小马不敲代码</span> <a class="tag" taget="_blank" href="/search/SpringBoot/1.htm">SpringBoot</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>详细介绍如何将一个SpringBoot应用程序部署到Kubernetes集群。从一个基础的SpringBoot应用开始,通过Docker容器化,最后完成Kubernetes集群的部署配置。这个过程将帮助你理解现代云原生应用部署的完整流程。示例项目SpringBoot2.6.13Java8Maven构建工具RESTfulAPI接口标准的项目结构项目结构如下:├──src/│├──main/││├──</div> </li> <li><a href="/article/1943213940909600768.htm" title="k8s深度讲解----宏观架构与集群之脑 - API Server 和 etcd" target="_blank">k8s深度讲解----宏观架构与集群之脑 - API Server 和 etcd</a> <span class="text-muted">weixin_42587823</span> <a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/etcd/1.htm">etcd</a> <div>宏观架构与集群之脑-APIServer和etcd宏观架构:数据中心的操作系统在开始之前,让我们先建立一个高层视角。你可以将Kubernetes想象成一个管理整个数据中心的分布式操作系统。在这个操作系统中:控制平面(ControlPlane)就是它的“内核”,负责管理和决策。工作节点(WorkerNodes)就是它的“CPU和内存”,是真正运行应用程序的地方。我们常用的kubectl就是与这个“内核</div> </li> <li><a href="/article/1943065821316182016.htm" title="容器和 Kubernetes 中的退出码" target="_blank">容器和 Kubernetes 中的退出码</a> <span class="text-muted">riverz1227</span> <a class="tag" taget="_blank" href="/search/k8s/1.htm">k8s</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a> <div>在Kubernetes中,Pod中容器的退出状态(exitCode)表示容器进程退出时的状态码。这个exitCode通常是应用程序或shell返回的标准UNIX/Linux退出码。理解常见的exitCode有助于我们快速定位容器异常退出的原因。一、常见exitCode及含义(基础类)exitCode含义说明常见原因0成功退出(正常)容器程序已完成任务或被优雅终止1一般性错误(GeneralErro</div> </li> <li><a href="/article/1943065568781332480.htm" title="Kubernetes Pod DNS 配置" target="_blank">Kubernetes Pod DNS 配置</a> <span class="text-muted">riverz1227</span> <a class="tag" taget="_blank" href="/search/k8s/1.htm">k8s</a><a class="tag" taget="_blank" href="/search/k8s/1.htm">k8s</a> <div>一、概述Kubernetes提供多种DNS策略(dnsPolicy),同时kubelet参数也影响最终的DNS行为。二、dnsPolicy策略说明dnsPolicy含义说明Default使用宿主机的DNS配置(kubelet的--resolv-conf)ClusterFirst优先使用集群DNS(如CoreDNS),仅在无法解析时退回宿主机DNS(默认策略)ClusterFirstWithHost</div> </li> <li><a href="/article/1942963348710682624.htm" title="Kubernetes Ingress 服务发布进阶" target="_blank">Kubernetes Ingress 服务发布进阶</a> <span class="text-muted">伤不起bb</span> <a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a> <div>目录一、核心概念与原理1.Ingress基础概念(1)Ingress的定位(2)Ingress与其他暴露方式对比(3)Ingress组成与分工2.Ingress工作原理(以Nginx为例)3.典型流量访问链路二、IngressNginxController安装(Helm方式)1.环境准备与工具安装2.核心配置文件修改(values.yaml)3.部署与验证命令三、Ingress基础使用:域名绑定服</div> </li> <li><a href="/article/1942891622597455872.htm" title="crazyswarm无人机集群搭建笔记(一)资料索引" target="_blank">crazyswarm无人机集群搭建笔记(一)资料索引</a> <span class="text-muted">X_SWARM</span> <a class="tag" taget="_blank" href="/search/%E6%97%A0%E4%BA%BA%E6%9C%BA%E9%9B%86%E7%BE%A4/1.htm">无人机集群</a><a class="tag" taget="_blank" href="/search/%E6%97%A0%E4%BA%BA%E6%9C%BA/1.htm">无人机</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/stm32/1.htm">stm32</a> <div>前言为了开展无人机集群虚实结合任务调度算法测试,这次采购了crazyflie套件,本系列主要记录从零开始搭建crazyswarm集群的详细步骤。本节主要包含crazyflie安装调试主要参考的文章和教程。一、crazyflie安装使用基本资料1.Bitcraze官方网站(1)Bitcraze官方网站主页(2)Bitcraze官网安装教程(3)crazyswarm2官方文档(4)crazyswarm</div> </li> <li><a href="/article/1942858465517039616.htm" title="Kubernetes日志运维痛点及日志系统架构设计 (Promtail+Loki+Grafana)" target="_blank">Kubernetes日志运维痛点及日志系统架构设计 (Promtail+Loki+Grafana)</a> <span class="text-muted"></span> <div>Kubernetes日志运维痛点及日志系统架构设计(Promtail+Loki+Grafana)运维痛点日志采集的可靠性与复杂性pod生命周期短、易销毁容器重启或Pod被销毁后,日志会丢失(除非已持久化或集中采集)。需要侧重于实时采集和转发,而不能依赖节点本地日志。多样化的日志来源与格式应用日志、系统日志、Kubernetes组件日志(如kubelet、kube-apiserver)、中间件日志(</div> </li> <li><a href="/article/1942852793521991680.htm" title="云原生时代的日志管理:ELK、Loki、Fluentd 如何选型?" target="_blank">云原生时代的日志管理:ELK、Loki、Fluentd 如何选型?</a> <span class="text-muted"></span> <div>一、引言在微服务和Kubernetes普及的今天,传统的日志管理方式已经难以应对高并发、分布式架构带来的挑战。随着容器化应用数量激增,日志数据量呈指数级增长,如何高效地收集、存储、查询和分析日志,成为每个团队必须面对的问题。在这样的背景下,ELK(Elasticsearch+Logstash+Kibana)、Loki和Fluentd成为当前主流的日志解决方案。它们各有特色,适用于不同规模和技术栈的</div> </li> <li><a href="/article/1942848759771754496.htm" title="CKA认证 | 使用kubeadm部署K8s集群(v1.26)" target="_blank">CKA认证 | 使用kubeadm部署K8s集群(v1.26)</a> <span class="text-muted">小安运维日记</span> <a class="tag" taget="_blank" href="/search/Kubernetes/1.htm">Kubernetes</a><a class="tag" taget="_blank" href="/search/CKA/1.htm">CKA</a><a class="tag" taget="_blank" href="/search/%E8%AE%A4%E8%AF%81%E5%9F%B9%E8%AE%AD/1.htm">认证培训</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/k8s/1.htm">k8s</a><a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a> <div>一、前置知识点1.1生产环境可部署Kubernetes集群的两种方式目前生产部署Kubernetes集群主要有两种方式:①kubeadmKubeadm是一个K8s部署工具,提供kubeadminit和kubeadmjoin,用于快速部署Kubernetes集群。②二进制包从github下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。这里采用kubeadm搭建集群kubeadm</div> </li> <li><a href="/article/1942818380037812224.htm" title="116、掌握Docker Compose与Kubernetes:Rust应用部署实操" target="_blank">116、掌握Docker Compose与Kubernetes:Rust应用部署实操</a> <span class="text-muted">多多的编程笔记</span> <a class="tag" taget="_blank" href="/search/Rust%E4%B9%8BWeb%E5%BC%80%E5%8F%91/1.htm">Rust之Web开发</a><a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/rust/1.htm">rust</a> <div>Rust部署与运维:掌握使用DockerCompose、Kubernetes等工具进行应用部署和管理1.引言Rust是一种注重性能、安全和并发的系统编程语言。近年来,随着云计算和微服务架构的普及,如何将Rust应用部署到生产环境中,成为越来越多开发者关注的问题。本文将介绍如何使用DockerCompose和Kubernetes等工具进行Rust应用的部署和管理。2.DockerCompose简介D</div> </li> <li><a href="/article/1942749164370718720.htm" title="开源的服务网格:Istio" target="_blank">开源的服务网格:Istio</a> <span class="text-muted">深海科技服务</span> <a class="tag" taget="_blank" href="/search/%E8%A1%8C%E4%B8%9A%E5%8F%91%E5%B1%95/1.htm">行业发展</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90/1.htm">开源</a><a class="tag" taget="_blank" href="/search/istio/1.htm">istio</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a> <div>一、lstio介绍Istio是一个开源的服务网格(ServiceMesh),它为微服务架构中的服务间通信提供了统一的管理、连接、安全、控制和可观测性。在复杂的云原生环境中,尤其是基于Kubernetes的部署中,随着微服务数量的增加,管理它们之间的网络通信会变得异常复杂。Istio就是为了解决这些挑战而设计的。1、为什么需要Istio?在传统的微服务架构中,开发人员需要在每个服务中编写代码来处理服</div> </li> <li><a href="/article/31.htm" title="312个免费高速HTTP代理IP(能隐藏自己真实IP地址)" target="_blank">312个免费高速HTTP代理IP(能隐藏自己真实IP地址)</a> <span class="text-muted">yangshangchuan</span> <a class="tag" taget="_blank" href="/search/%E9%AB%98%E9%80%9F/1.htm">高速</a><a class="tag" taget="_blank" href="/search/%E5%85%8D%E8%B4%B9/1.htm">免费</a><a class="tag" taget="_blank" href="/search/superword/1.htm">superword</a><a class="tag" taget="_blank" href="/search/HTTP%E4%BB%A3%E7%90%86/1.htm">HTTP代理</a> <div>    124.88.67.20:843 190.36.223.93:8080 117.147.221.38:8123 122.228.92.103:3128 183.247.211.159:8123 124.88.67.35:81 112.18.51.167:8123 218.28.96.39:3128 49.94.160.198:3128 183.20</div> </li> <li><a href="/article/158.htm" title="pull解析和json编码" target="_blank">pull解析和json编码</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/pull%E8%A7%A3%E6%9E%90/1.htm">pull解析</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a> <div>n.json文件: [{name:java,lan:c++,age:17},{name:android,lan:java,age:8}]   pull.xml文件 <?xml version="1.0" encoding="utf-8"?> <stu>     <name>java</div> </li> <li><a href="/article/285.htm" title="[能源与矿产]石油与地球生态系统" target="_blank">[能源与矿产]石油与地球生态系统</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E8%83%BD%E6%BA%90/1.htm">能源</a> <div>       按照苏联的科学界的说法,石油并非是远古的生物残骸的演变产物,而是一种可以由某些特殊地质结构和物理条件生产出来的东西,也就是说,石油是可以自增长的....       那么我们做一个猜想: 石油好像是地球的体液,我们地球具有自动产生石油的某种机制,只要我们不过量开采石油,并保护好</div> </li> <li><a href="/article/412.htm" title="类与对象浅谈" target="_blank">类与对象浅谈</a> <span class="text-muted">沐刃青蛟</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%9F%BA%E7%A1%80/1.htm">基础</a> <div>        类,字面理解,便是同一种事物的总称,比如人类,是对世界上所有人的一个总称。而对象,便是类的具体化,实例化,是一个具体事物,比如张飞这个人,就是人类的一个对象。但要注意的是:张飞这个人是对象,而不是张飞,张飞只是他这个人的名字,是他的属性而已。而一个类中包含了属性和方法这两兄弟,他们分别用来描述对象的行为和性质(感觉应该是</div> </li> <li><a href="/article/539.htm" title="新站开始被收录后,我们应该做什么?" target="_blank">新站开始被收录后,我们应该做什么?</a> <span class="text-muted">IT独行者</span> <a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/seo/1.htm">seo</a> <div>新站开始被收录后,我们应该做什么?         百度终于开始收录自己的网站了,作为站长,你是不是觉得那一刻很有成就感呢,同时,你是不是又很茫然,不知道下一步该做什么了?至少我当初就是这样,在这里和大家一份分享一下新站收录后,我们要做哪些工作。       至于如何让百度快速收录自己的网站,可以参考我之前的帖子《新站让百</div> </li> <li><a href="/article/666.htm" title="oracle 连接碰到的问题" target="_blank">oracle 连接碰到的问题</a> <span class="text-muted">文强chu</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a> <div>Unable to find a java Virtual Machine--安装64位版Oracle11gR2后无法启动SQLDeveloper的解决方案 作者:草根IT网 来源:未知 人气:813标签: 导读:安装64位版Oracle11gR2后发现启动SQLDeveloper时弹出配置java.exe的路径,找到Oracle自带java.exe后产生的路径“C:\app\用户名\prod</div> </li> <li><a href="/article/793.htm" title="Swing中按ctrl键同时移动鼠标拖动组件(类中多借口共享同一数据)" target="_blank">Swing中按ctrl键同时移动鼠标拖动组件(类中多借口共享同一数据)</a> <span class="text-muted">小桔子</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%BB%A7%E6%89%BF/1.htm">继承</a><a class="tag" taget="_blank" href="/search/swing/1.htm">swing</a><a class="tag" taget="_blank" href="/search/%E6%8E%A5%E5%8F%A3/1.htm">接口</a><a class="tag" taget="_blank" href="/search/%E7%9B%91%E5%90%AC/1.htm">监听</a> <div>        都知道java中类只能单继承,但可以实现多个接口,但我发现实现多个接口之后,多个接口却不能共享同一个数据,应用开发中想实现:当用户按着ctrl键时,可以用鼠标点击拖动组件,比如说文本框。 编写一个监听实现KeyListener,NouseListener,MouseMotionListener三个接口,重写方法。定义一个全局变量boolea</div> </li> <li><a href="/article/920.htm" title="linux常用的命令" target="_blank">linux常用的命令</a> <span class="text-muted">aichenglong</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/1.htm">常用命令</a> <div>1 startx切换到图形化界面 2 man命令:查看帮助信息 man 需要查看的命令,man命令提供了大量的帮助信息,一般可以分成4个部分 name:对命令的简单说明 synopsis:命令的使用格式说明 description:命令的详细说明信息 options:命令的各项说明 3 date:显示时间 语法:date [OPTION]... [+FORMAT] </div> </li> <li><a href="/article/1047.htm" title="eclipse内存优化" target="_blank">eclipse内存优化</a> <span class="text-muted">AILIKES</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a> <div>一 基本说明      在JVM中,总体上分2块内存区,默认空余堆内存小于 40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。     1)堆内存(Heap memory):堆是运行时数据区域,所有类实例和数组的内存均从此处分配,是Java代码可及的内存,是留给开发人</div> </li> <li><a href="/article/1174.htm" title="关键字的使用探讨" target="_blank">关键字的使用探讨</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/%E5%85%B3%E9%94%AE%E5%AD%97/1.htm">关键字</a> <div>//关键字的使用探讨/*访问关键词private 只能在本类中访问public 只能在本工程中访问protected 只能在包中和子类中访问默认的 只能在包中访问*//*final   类 方法 变量 final 类 不能被继承 final 方法 不能被子类覆盖,但可以继承 final 变量 只能有一次赋值,赋值后不能改变 final 不能用来修饰构造方法*///this()</div> </li> <li><a href="/article/1301.htm" title="JS中定义对象的几种方式" target="_blank">JS中定义对象的几种方式</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/js/1.htm">js</a> <div>    1. 基于已有对象扩充其对象和方法(只适合于临时的生成一个对象): <html> <head> <title>基于已有对象扩充其对象和方法(只适合于临时的生成一个对象)</title> </head> <script> var obj = new Object(); </div> </li> <li><a href="/article/1428.htm" title="表驱动法实例" target="_blank">表驱动法实例</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%A1%A8%E9%A9%B1%E5%8A%A8%E6%B3%95/1.htm">表驱动法</a><a class="tag" taget="_blank" href="/search/TDD/1.htm">TDD</a> <div>获得月的天数是典型的直接访问驱动表方式的实例,下面我们来展示一下: MonthDaysTest.java package com.study.test; import org.junit.Assert; import org.junit.Test; import com.study.MonthDays; public class MonthDaysTest { @T</div> </li> <li><a href="/article/1555.htm" title="LInux启停重启常用服务器的脚本" target="_blank">LInux启停重启常用服务器的脚本</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>启动,停止和重启常用服务器的Bash脚本,对于每个服务器,需要根据实际的安装路径做相应的修改   #! /bin/bash Servers=(Apache2, Nginx, Resin, Tomcat, Couchbase, SVN, ActiveMQ, Mongo); Ops=(Start, Stop, Restart); currentDir=$(pwd); echo</div> </li> <li><a href="/article/1682.htm" title="【HBase六】REST操作HBase" target="_blank">【HBase六】REST操作HBase</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/hbase/1.htm">hbase</a> <div>HBase提供了REST风格的服务方便查看HBase集群的信息,以及执行增删改查操作   1. 启动和停止HBase REST 服务 1.1 启动REST服务 前台启动(默认端口号8080) [hadoop@hadoop bin]$ ./hbase rest start   后台启动 hbase-daemon.sh start rest   启动时指定</div> </li> <li><a href="/article/1809.htm" title="大话zabbix 3.0设计假设" target="_blank">大话zabbix 3.0设计假设</a> <span class="text-muted">ronin47</span> <div>What’s new in Zabbix 2.0? 去年开始使用Zabbix的时候,是1.8.X的版本,今年Zabbix已经跨入了2.0的时代。看了2.0的release notes,和performance相关的有下面几个:          :: Performance improvements::Trigger related da</div> </li> <li><a href="/article/1936.htm" title="http错误码大全" target="_blank">http错误码大全</a> <span class="text-muted">byalias</span> <a class="tag" taget="_blank" href="/search/http%E5%8D%8F%E8%AE%AE/1.htm">http协议</a><a class="tag" taget="_blank" href="/search/javaweb/1.htm">javaweb</a> <div>响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行。 响应码分五种类型,由它们的第一位数字表示: 1)1xx:信息,请求收到,继续处理 2)2xx:成功,行为被成功地接受、理解和采纳 3)3xx:重定向,为了完成请求,必须进一步执行的动作 4)4xx:客户端错误,请求包含语法错误或者请求无法实现 5)5xx:服务器错误,服务器不能实现一种明显无效的请求 </div> </li> <li><a href="/article/2063.htm" title="J2EE设计模式-Intercepting Filter" target="_blank">J2EE设计模式-Intercepting Filter</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a> <div>Intercepting Filter类似于职责链模式 有两种实现 其中一种是Filter之间没有联系,全部Filter都存放在FilterChain中,由FilterChain来有序或无序地把把所有Filter调用一遍。没有用到链表这种数据结构。示例如下: package com.ljn.filter.custom; import java.util.ArrayList;</div> </li> <li><a href="/article/2190.htm" title="修改jboss端口" target="_blank">修改jboss端口</a> <span class="text-muted">chicony</span> <a class="tag" taget="_blank" href="/search/jboss/1.htm">jboss</a> <div>修改jboss端口   %JBOSS_HOME%\server\{服务实例名}\conf\bindingservice.beans\META-INF\bindings-jboss-beans.xml   中找到 <!-- The ports-default bindings are obtained by taking the base bindin</div> </li> <li><a href="/article/2317.htm" title="c++ 用类模版实现数组类" target="_blank">c++ 用类模版实现数组类</a> <span class="text-muted">CrazyMizzz</span> <a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a> <div>最近c++学到数组类,写了代码将他实现,基本具有vector类的功能 #include<iostream> #include<string> #include<cassert> using namespace std; template<class T> class Array { public: //构造函数 </div> </li> <li><a href="/article/2444.htm" title="hadoop dfs.datanode.du.reserved 预留空间配置方法" target="_blank">hadoop dfs.datanode.du.reserved 预留空间配置方法</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a><a class="tag" taget="_blank" href="/search/%E9%A2%84%E7%95%99%E7%A9%BA%E9%97%B4/1.htm">预留空间</a> <div>对于datanode配置预留空间的方法 为:在hdfs-site.xml添加如下配置  <property>     <name>dfs.datanode.du.reserved</name>     <value>10737418240</value>    </div> </li> <li><a href="/article/2571.htm" title="mysql远程访问的设置" target="_blank">mysql远程访问的设置</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E9%98%B2%E7%81%AB%E5%A2%99/1.htm">防火墙</a> <div>第一步: 激活网络设置 你需要编辑mysql配置文件my.cnf. 通常状况,my.cnf放置于在以下目录: /etc/mysql/my.cnf (Debian linux) /etc/my.cnf (Red Hat Linux/Fedora Linux) /var/db/mysql/my.cnf (FreeBSD) 然后用vi编辑my.cnf,修改内容从以下行: [mysqld] 你所需要: 1</div> </li> <li><a href="/article/2698.htm" title="ios 使用特定的popToViewController返回到相应的Controller" target="_blank">ios 使用特定的popToViewController返回到相应的Controller</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/controller/1.htm">controller</a> <div>1、取navigationCtroller中的Controllers NSArray * ctrlArray = self.navigationController.viewControllers; 2、取出后,执行, [self.navigationController popToViewController:[ctrlArray objectAtIndex:0] animated:YES</div> </li> <li><a href="/article/2825.htm" title="Linux正则表达式和通配符的区别" target="_blank">Linux正则表达式和通配符的区别</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a><a class="tag" taget="_blank" href="/search/%E9%80%9A%E9%85%8D%E7%AC%A6%E5%92%8C%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%9A%84%E5%8C%BA%E5%88%AB/1.htm">通配符和正则表达式的区别</a><a class="tag" taget="_blank" href="/search/%E9%80%9A%E9%85%8D%E7%AC%A6/1.htm">通配符</a> <div>转载请出自出处:http://eksliang.iteye.com/blog/1976579 首先得明白二者是截然不同的 通配符只能用在shell命令中,用来处理字符串的的匹配。 判断一个命令是否为bash shell(linux 默认的shell)的内置命令 type -t commad 返回结果含义 file  表示为外部命令 alias  表示该</div> </li> <li><a href="/article/2952.htm" title="Ubuntu Mysql Install and CONF" target="_blank">Ubuntu Mysql Install and CONF</a> <span class="text-muted">gengzg</span> <a class="tag" taget="_blank" href="/search/Install/1.htm">Install</a> <div>http://www.navicat.com.cn/download/navicat-for-mysql Step1: 下载Navicat ,网址:http://www.navicat.com/en/download/download.html Step2:进入下载目录,解压压缩包:tar -zxvf navicat11_mysql_en.tar.gz </div> </li> <li><a href="/article/3079.htm" title="批处理,删除文件bat" target="_blank">批处理,删除文件bat</a> <span class="text-muted">huqiji</span> <a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/dos/1.htm">dos</a> <div>@echo off ::演示:删除指定路径下指定天数之前(以文件名中包含的日期字符串为准)的文件。 ::如果演示结果无误,把del前面的echo去掉,即可实现真正删除。 ::本例假设文件名中包含的日期字符串(比如:bak-2009-12-25.log) rem 指定待删除文件的存放路径 set SrcDir=C:/Test/BatHome rem 指定天数 set DaysAgo=1</div> </li> <li><a href="/article/3206.htm" title="跨浏览器兼容的HTML5视频音频播放器" target="_blank">跨浏览器兼容的HTML5视频音频播放器</a> <span class="text-muted">天梯梦</span> <a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a> <div>HTML5的video和audio标签是用来在网页中加入视频和音频的标签,在支持html5的浏览器中不需要预先加载Adobe Flash浏览器插件就能轻松快速的播放视频和音频文件。而html5media.js可以在不支持html5的浏览器上使video和audio标签生效。   How to enable <video> and <audio> tags in </div> </li> <li><a href="/article/3333.htm" title="Bundle自定义数据传递" target="_blank">Bundle自定义数据传递</a> <span class="text-muted">hm4123660</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/Serializable/1.htm">Serializable</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%AE%9A%E4%B9%89%E6%95%B0%E6%8D%AE%E4%BC%A0%E9%80%92/1.htm">自定义数据传递</a><a class="tag" taget="_blank" href="/search/Bundle/1.htm">Bundle</a><a class="tag" taget="_blank" href="/search/Parcelable/1.htm">Parcelable</a> <div>      我们都知道Bundle可能过put****()方法添加各种基本类型的数据,Intent也可以通过putExtras(Bundle)将数据添加进去,然后通过startActivity()跳到下一下Activity的时候就把数据也传到下一个Activity了。如传递一个字符串到下一个Activity   把数据放到Intent</div> </li> <li><a href="/article/3460.htm" title="C#:异步编程和线程的使用(.NET 4.5 )" target="_blank">C#:异步编程和线程的使用(.NET 4.5 )</a> <span class="text-muted">powertoolsteam</span> <a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a><a class="tag" taget="_blank" href="/search/%E7%BA%BF%E7%A8%8B/1.htm">线程</a><a class="tag" taget="_blank" href="/search/C%23/1.htm">C#</a><a class="tag" taget="_blank" href="/search/%E5%BC%82%E6%AD%A5%E7%BC%96%E7%A8%8B/1.htm">异步编程</a> <div>异步编程和线程处理是并发或并行编程非常重要的功能特征。为了实现异步编程,可使用线程也可以不用。将异步与线程同时讲,将有助于我们更好的理解它们的特征。 本文中涉及关键知识点 1. 异步编程 2. 线程的使用 3. 基于任务的异步模式 4. 并行编程 5. 总结 异步编程 什么是异步操作?异步操作是指某些操作能够独立运行,不依赖主流程或主其他处理流程。通常情况下,C#程序</div> </li> <li><a href="/article/3587.htm" title="spark 查看 job history 日志" target="_blank">spark 查看 job history 日志</a> <span class="text-muted">Stark_Summer</span> <a class="tag" taget="_blank" href="/search/%E6%97%A5%E5%BF%97/1.htm">日志</a><a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a><a class="tag" taget="_blank" href="/search/history/1.htm">history</a><a class="tag" taget="_blank" href="/search/job/1.htm">job</a> <div>SPARK_HOME/conf 下: spark-defaults.conf 增加如下内容 spark.eventLog.enabled true spark.eventLog.dir hdfs://master:8020/var/log/spark spark.eventLog.compress true spark-env.sh 增加如下内容 export SP</div> </li> <li><a href="/article/3714.htm" title="SSH框架搭建" target="_blank">SSH框架搭建</a> <span class="text-muted">wangxiukai2015eye</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a><a class="tag" taget="_blank" href="/search/struts/1.htm">struts</a> <div>MyEclipse搭建SSH框架 Struts Spring Hibernate 1、new一个web project。 2、右键项目,为项目添加Struts支持。    选择Struts2 Core Libraries -<MyEclipes-Library>      点击Finish。src目录下多了struts</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>