热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

centos7使用二进制包搭建kubernetes1.9.0集群

kubernetes发展速度非常,至少在目前来说是非常不错的,很多大公司都在使用容器技术部署项目,而最近比较火的容器管理工具就是kubernetes了。由于之前公司一直使用的还是yum安装

kubernetes 发展速度非常,至少在目前来说是非常不错的,很多大公司都在使用容器技术部署项目,而最近比较火的容器管理工具就是kubernetes了。

由于之前公司一直使用的还是yum安装的v1.5.2,因为没什么大的需求就一直没有更新到新版本,这次出来的1.9.0版本。听说功能更强大,所以就自己机器上搭建一个小群集来测试。因为网上还没有build好的rpm包,原本自己打算制作一个的,但是技术信息有限暂时未能做出来。可是又很想使用新版本,所以直接在网官上下载一个二进制的tar包来。

 

系统:CentOS Linux release 7.2.1511 (Core)

内核可以升级,如果不升级也可以运行,但是会在日志里有提示。

 
 
  1. ######################################################## 
  2. 节点名         主机名         IP地址 
  3. etcd            etcd            10.0.10.11 
  4. k8s-master      k8s-master      10.0.10.12 
  5. k8s-node1       k8s-node1       10.0.10.13 
  6. k8s-node2       k8s-node2       10.0.10.14 

 机器之间做好时间同步:

 
 
  1. yum install ntpd -y  
  2. systemctl start ntpd  
  3. systemctl enable ntpd 

添加主机名IP地址的对应解析到/etc/hosts文件:

 
 
  1. [root@k8s-master system]# tail -5 /etc/hosts 
  2. 192.168.18.54   reg.docker.tb 
  3. 10.0.10.11  etcd 
  4. 10.0.10.12  k8s-master 
  5. 10.0.10.13  k8s-node1 
  6. 10.0.10.14  k8s-node2 

 

并在Master节点上做一个ssh-key免密登陆,传到每个节点上,和etcd机器。

 

 软件包下载地址:

etcd:https://github.com/coreos/etcd/releases/download/v3.2.11/etcd-v3.2.11-linux-amd64.tar.gz

kubernetes: https://codeload.github.com/kubernetes/kubernetes/tar.gz/v1.9.0

 

配置Etcd服务器

 
 
  1. tar xf etcd-v3.2.11-linux-amd64.tar.gz 
  2. cd etcd-v3.2.11-linux-amd64 
  3. cp etcd etcdctl /usr/bin/ 

添加用户和组,这里的组ID和用户ID可以不用指定

 
 
  1. [root@etcd system]# groupadd -g 990 etcd 
  2. [root@etcd system]# useradd -s /sbin/nologin -M -c "etcd user" -u 991 etcd -g etcd 
  3. [root@etcd system]# id etcd 
  4. uid=991(etcd) gid=990(etcd) groups=990(etcd) 

创建启动文件:/usr/lib/systemd/system/etcd.service 

 
 
  1. [Unit] 
  2. Description=Etcd Server 
  3. After=network.target 
  4. After=network-online.target 
  5. Wants=network-online.target 
  6.  
  7. [Service] 
  8. Type=notify 
  9. WorkingDirectory=/var/lib/etcd/ 
  10. EnvironmentFile=-/etc/etcd/etcd.conf 
  11. User=etcd 
  12. # set GOMAXPROCS to number of processors 
  13. ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /usr/bin/etcd --name=\"${ETCD_NAME}\" --data-dir=\"${ETCD_DATA_DIR}\" --listen-client-urls=\"${ETCD_LISTEN_CLIENT_URLS}\"" 
  14. Restart=on-failure 
  15. LimitNOFILE=65536 
  16.  
  17. [Install] 
  18. WantedBy=multi-user.target 

 

创建启动文件中用到的目录,这个是根据rpm包的思路操作:

 
 
  1. mkdir -p /etc/etcd 
  2. mkdir -p /var/lib/etcd 
  3. chown -R etcd.etcd /var/lib/etcd 

 

启动服务,并检查状态:

 
 
  1. systemctl start etcd 
  2. systemctl enable etcd 
  3.  
  4. #检查健康状态: 
  5. [root@etcd system]# etcdctl -C http://etcd:2379 cluster-health 
  6. member 8e9e05c52164694d is healthy: got healthy result from http://10.0.10.11:2379 
  7. cluster is healthy 

 

配置Master节点:

Master节点上只需要运行这几个服务:apiserver、controller-manager、scheduler

 直接解压文件并复制到系统路径下,如果不这样做就添加环境变量 。

 
 
  1. tar xf kubernetes-server-linux-amd64.tar.gz 
  2. cd kubernetes/server/bin 
  3.  
  4. 复制执行文件到/usr/bin目录下: 
  5. find ./ -perm 750|xargs chmod 755 
  6. find ./ -perm 750|xargs -i cp {} /usr/bin/ 

 

查检kubernetes版本:

 
 
  1. [root@k8s-master bin]# kubectl version 
  2. Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2017-12-15T21:07:38Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"} 
  3. The connection to the server localhost:8080 was refused - did you specify the right host or port? 

把下面几个启动文件添加到系统以下目录下:/usr/lib/systemd/system/ 

启动文件:kube-apiserver.service

 

 
 
  1. [Unit] 
  2. Description=Kubernetes API Server 
  3. Documentation=https://github.com/GoogleCloudPlatform/kubernetes 
  4. After=network.target 
  5. After=etcd.service 
  6.  
  7. [Service] 
  8. EnvironmentFile=-/etc/kubernetes/config 
  9. EnvironmentFile=-/etc/kubernetes/apiserver 
  10. User=kube 
  11. ExecStart=/usr/bin/kube-apiserver \ 
  12.         $KUBE_LOGTOSTDERR \ 
  13.         $KUBE_LOG_LEVEL \ 
  14.         $KUBE_ETCD_SERVERS \ 
  15.         $KUBE_API_ADDRESS \ 
  16.         $KUBE_API_PORT \ 
  17.         $KUBELET_PORT \ 
  18.         $KUBE_ALLOW_PRIV \ 
  19.         $KUBE_SERVICE_ADDRESSES \ 
  20.         $KUBE_ADMISSION_CONTROL \ 
  21.         $KUBE_API_ARGS 
  22. Restart=on-failure 
  23. Type=notify 
  24. LimitNOFILE=65536 
  25.  
  26. [Install] 
  27. WantedBy=multi-user.target 

 

启动文件:kube-controller-manager.service

 
 
  1. kube-controller-manager.service 
  2.  
  3. [Unit] 
  4. Description=Kubernetes Controller Manager 
  5. Documentation=https://github.com/GoogleCloudPlatform/kubernetes 
  6.  
  7. [Service] 
  8. EnvironmentFile=-/etc/kubernetes/config 
  9. EnvironmentFile=-/etc/kubernetes/controller-manager 
  10. User=kube 
  11. ExecStart=/usr/bin/kube-controller-manager \ 
  12.         $KUBE_LOGTOSTDERR \ 
  13.         $KUBE_LOG_LEVEL \ 
  14.         $KUBE_MASTER \ 
  15.         $KUBE_CONTROLLER_MANAGER_ARGS 
  16. Restart=on-failure 
  17. LimitNOFILE=65536 
  18.  
  19. [Install] 
  20. WantedBy=multi-user.target 

 

启动文件:kube-scheduler.service

 

 
 
  1. [Unit] 
  2. Description=Kubernetes Scheduler Plugin 
  3. Documentation=https://github.com/GoogleCloudPlatform/kubernetes 
  4.  
  5. [Service] 
  6. EnvironmentFile=-/etc/kubernetes/config 
  7. EnvironmentFile=-/etc/kubernetes/scheduler 
  8. User=kube 
  9. ExecStart=/usr/bin/kube-scheduler \ 
  10.         $KUBE_LOGTOSTDERR \ 
  11.         $KUBE_LOG_LEVEL \ 
  12.         $KUBE_MASTER \ 
  13.         $KUBE_SCHEDULER_ARGS 
  14. Restart=on-failure 
  15. LimitNOFILE=65536 
  16.  
  17. [Install] 
  18. WantedBy=multi-user.target 

 

添加用户和组:只要系统ID不存在的就可以了

 
 
  1. groupadd -g 992 kube 
  2. useradd -s /sbin/nologin -M -c "kube user" -u 996 kube -g kube 

 

创建相应的目录,并授权权限:

 
 
  1. mkdir -p /etc/kubernetes 
  2. #mkdir -p /var/run/kubernetes 
  3. mkdir -p /usr/libexec/kubernetes 
  4. #chown -R kube.kube /var/run/kubernetes/  #被下面的方法替换了
  5. chown -R kube.kube /usr/libexec/kubernetes 

 

2018-02-01补充:由于kube-apiserver启动的时候会在/var/run/kubernetes下自动创建apiserver.crt 和apiserver.key两个文件,因为此目录默认不存在的而上面手工创建后,Node节点重启过系统 的话就要丢失,导致kube-apiserver启动失败,日志如下:

 
 
  1. Feb  1 08:45:58 k8s-master kube-apiserver: error creating self-signed certificates: mkdir /var/run/kubernetes: permission denied  

 

所以解决方法就是:进入/usr/lib/tmpfiles.d/创建一个配置文件,这里文件会在系统启动的时候自动执行。

 
 
  1. [root@k8s-master ~]# cd /usr/lib/tmpfiles.d/  
  2.  
  3. [root@k8s-master tmpfiles.d]# cat kubernetes.conf   
  4. d /var/run/kubernetes 0755 kube kube -  

 

 

启动服务:

 
 
  1. for service in kube-apiserver kube-controller-manager kube-scheduler;do systemctl restart $service && systemctl enable $service ;done 

 

Node节点安装

node节点上跑的服务就这 几个:kubelet,kube-proxy

直接把master上的几个执行文件传到Node节点的/usr/bin目录下:

 

 
 
  1. scp kube-proxy kubelet k8s-node1:/usr/bin/ 
  2. scp kube-proxy kubelet k8s-node2:/usr/bin/ 

 

 

添加用户和组:只要系统不存在的就可以了

 
 
  1. groupadd -g 992 kube 
  2. useradd -s /sbin/nologin -M -c "kube user" -u 996 kube -g kube 

 

 创建相应的目录:

 

 
 
  1. mkdir -p /etc/kubernetes  
  2. mkdir -p /var/run/kubernetes  
  3. chown -R kube.kube /var/run/kubernetes/  
  4. mkdir -p /var/lib/kubelet  
  5. chown -R kube.kube /var/lib/kubelet 
  6. mkdir -p /usr/libexec/kubernetes 
  7. chown -R kube.kube /usr/libexec/kubernetes 
  8.  

 

添加启动文件:kubelet.service

 

 
 
  1. [Unit] 
  2. Description=Kubernetes Kubelet Server 
  3. Documentation=https://github.com/GoogleCloudPlatform/kubernetes 
  4. After=docker.service 
  5. Requires=docker.service 
  6.  
  7. [Service] 
  8. WorkingDirectory=/var/lib/kubelet 
  9. EnvironmentFile=-/etc/kubernetes/config 
  10. EnvironmentFile=-/etc/kubernetes/kubelet 
  11. ExecStart=/usr/bin/kubelet \ 
  12.         $KUBE_LOGTOSTDERR \ 
  13.         $KUBE_LOG_LEVEL \ 
  14.         $KUBELET_API_SERVER \ 
  15.         $KUBELET_ADDRESS \ 
  16.         $KUBELET_PORT \ 
  17.         $KUBELET_HOSTNAME \ 
  18.         $KUBE_ALLOW_PRIV \ 
  19.         $KUBELET_POD_INFRA_CONTAINER \ 
  20.         $KUBELET_ARGS 
  21. Restart=on-failure 
  22.  
  23. [Install] 
  24. WantedBy=multi-user.target 

 

添加启动文件:kube-proxy.service

 

 
 
  1. [Unit] 
  2. Description=Kubernetes Kube-Proxy Server 
  3. Documentation=https://github.com/GoogleCloudPlatform/kubernetes 
  4. After=network.target 
  5.  
  6. [Service] 
  7. EnvironmentFile=-/etc/kubernetes/config 
  8. EnvironmentFile=-/etc/kubernetes/proxy 
  9. ExecStart=/usr/bin/kube-proxy \ 
  10.         $KUBE_LOGTOSTDERR \ 
  11.         $KUBE_LOG_LEVEL \ 
  12.         $KUBE_MASTER \ 
  13.         $KUBE_PROXY_ARGS 
  14. Restart=on-failure 
  15. LimitNOFILE=65536 
  16.  
  17. [Install] 
  18. WantedBy=multi-user.target 

 

添加配置文件到/etc/kubernetes目录下:

config

 
 
  1. [root@k8s-node2 kubernetes]# egrep -v "^$|^#" config  
  2. KUBE_LOGTOSTDERR="--logtostderr=true" 
  3. KUBE_LOG_LEVEL="--v=0" 
  4. KUBE_ALLOW_PRIV="--allow-privileged=false" 
  5. KUBE_MASTER="--master=http://k8s-master:8080" 

 

proxy,没什么内容,但是要文件存在。

 
 
  1. [root@k8s-node2 kubernetes]# egrep -v "^$|^#" proxy 
  2. KUBE_PROXY_ARGS="" 

 

kubelet

 
 
  1. [root@k8s-node2 kubernetes]# egrep -v "^$|^#" kubelet  
  2. KUBELET_HOSTNAME="--hostname-override=k8s-node2" 
  3. KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=reg.docker.tb/harbor/pod-infrastructure:latest" 
  4. KUBELET_ARGS="--enable-server=true --enable-debugging-handlers=true --fail-s
  5. wap-on=false --kubecOnfig=/var/lib/kubelet/kubeconfig" 

这里需要注意的,如果机器开启了swap分区的话,kubernetes会无法启动,需要关闭。

 

然后还要添加一个配置文件,因为1.9.0在kubelet里不再使用KUBELET_API_SERVER来跟API通信,而是通过别一个yaml的配置来实现。

 

 
 
  1. [root@k8s-node2 kubernetes]# cat /var/lib/kubelet/kubeconfig 
  2. apiVersion: v1 
  3. kind: Config 
  4. users: 
  5. - name: kubelet 
  6. clusters: 
  7. - name: kubernetes 
  8.   cluster: 
  9.     server: http://k8s-master:8080 
  10. contexts: 
  11. - context: 
  12.     cluster: kubernetes 
  13.     user: kubelet 
  14.   name: service-account-context 
  15. current-context: service-account-context 

 

添加后注意授权,不然会报没权限:

 
 
  1. chown -R kube.kube /var/lib/kubelet/ 

 

Node节点上安装docker-1.12.6

 
 

 

  1. 安装epel源: 
  2. rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 
  3.  
  4. yum install docker -y 

 

修改docker的配置文件,加入私有仓库:/etc/sysconfig/docker

 
 
 
  1. INSECURE_REGISTRY="--insecure-registry reg.docker.tb" 

 

因为docker默认使用的

这里只要修改docker跟kubernetes一样即可。/usr/lib/systemd/system/docker.service

 
 
  1. --exec-opt native.cgroupdriver=cgroupfs \ 

 

启动docker服务,登陆验证:

 
 
  1. 启动docker服务,登陆验证: 
  2. [root@k8s-node2 kubernetes]# docker login reg.docker.tb 
  3. Username : upload 
  4. Password:  
  5. Login Succeeded 
如果多个Node节点怎么办?可以直接把文件传到每个节点上。
 
 
 
  1. [root@k8s-node2 kubernetes]# ll /root/.docker/config.json  
  2. -rw------- 1 root root 154 Jan 30 17:29 /root/.docker/config.json 

 

启动kubelet 、kube-proxy服务

 
 
  1. for service in kube-proxy kubelet docker;do systemctl start $service && systemctl enable $service;done 

 

Node节点上启动时遇到的问题:

error: failed to run Kubelet: failed to create kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"

解决方法就是使用上面的kubelet配置:

 
 
  1. Environment="KUBELET_KUBECONFIG_ARGS=--kubecOnfig=/etc/kubernetes/kubelet.conf --require-kubecOnfig=true  --cgroup-driver=systemd" 

这是因为docker 使用的cgroup-driver跟kubernetes的不一样,所以就会报异常。

 

异常提示: factory.go:340] devicemapper filesystem stats will not be reported: RHEL/Centos 7.x kernel version 3.10.0-366 or later is required to use thin_ls - you have "3.10.0-327.el7.x86_64"

 

k8s 1.9.0版本在使用内核方面要求3.10.366以上,如果要升级内核可以使用以下方法:

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm;yum --enablerepo=elrepo-kernel install  kernel-lt-devel kernel-lt -y

 
 安装完后可以查看是否默认为新的内核:
 
 
 
  1. [root@k8s-node2 kubernetes]# egrep ^menu /etc/grub2.cfg|cut -f 2 -d \'  
  2. CentOS Linux (4.4.113-1.el7.elrepo.x86_64) 7 (Core) 
  3. CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core) 
  4. CentOS Linux (0-rescue-8a1328ef9a7247f09fe7bedb9a9d95c0) 7 (Core) 
 
设置新内核为默认选项:
 
 
 
  1. grub2-set-default 'CentOS Linux (4.4.113-1.el7.elrepo.x86_64) 7 (Core)' 
核对结果:
[root@k8s-node2 kubernetes]# grub2-editenv list
saved_entry=CentOS Linux (4.4.113-1.el7.elrepo.x86_64) 7 (Core)
 
 
最后把etcd,master,和Node节点都启动,在master节点上检查一下效果。
 
 
  
  1. 返回以下结果说明跟etcd的通信正常: 
  2.  
  3. [root@k8s-master system]# kubectl get cs 
  4. NAME                 STATUS    MESSAGE              ERROR 
  5. scheduler            Healthy   ok                    
  6. controller-manager   Healthy   ok                    
  7. etcd-0               Healthy   {"health": "true"}  
 
 
 
  
  1. 返回以下结果说明两个Node节点跟Master,etcd通信正常,因为节点上的配置信息数据都是存储在etcd服务上的。 
  2.  
  3. [root@k8s-master system]# kubectl get node 
  4. NAME        STATUS    ROLES     AGE       VERSION 
  5. k8s-node1   Ready     <none>    5h        v1.9.0 
  6. k8s-node2   Ready     <none>    5h        v1.9.0 
 
创建一个yaml测试文件,现在两个node节点上都没有任何镜像,一会直接创建会自动去我指定的仓库里下载。
nginx-rc.yaml
 
 
  
  1. apiVersion: v1 
  2. kind: ReplicationController 
  3. metadata: 
  4.   name: nginx-rc 
  5. spec: 
  6.   replicas: 2 
  7.   selector: 
  8.     app: nginx 
  9.   template: 
  10.     metadata: 
  11.       labels: 
  12.         app: nginx 
  13.     spec: 
  14.       containers: 
  15.       - name: nginx 
  16.         image: reg.docker.tb/harbor/nginx 
  17.         ports: 
  18.         - containerPort: 80 
 
在等待一会后,下载完镜像就可以看到效果了。
 
 
第一个就是pod基础包,我把它下载回来并打上tag上传到自己的仓库里了。
 
在master节点上可以看到刚才创建的rc共创建两个容器,现在已经启动了一个,因为我使用的笔记本走wifi比较慢。
 
 
 
  1. [root@k8s-master yaml]# kubectl get po 
  2. NAME             READY     STATUS              RESTARTS   AGE 
  3. nginx-rc-74s85   1/1       Running             0          8m 
  4. nginx-rc-kc5tx   0/1       ContainerCreating   0          8m 
 
这里要注意一下kubernetes与docker的版本支持,之前我还是使用docker-ce最新版的,发现有问题,就比如网络不通。
 

 安装flannel网络插件

首先在etcd服务器上添加一个网络配置,这个网络配置自己随意只要在flannl的配置里一样即可。

 
 
  1. etcdctl set /atomic.io/network/config '{ "Network": "172.21.0.0/16" }' 

为了 方便管理,在Master节点上也安装上flannl插件,就是除了这个etcd服务器上不安装,其它的都安装上。

下载地址:https://github.com/coreos/flannel/releases/download/v0.9.0/flannel-v0.9.0-linux-amd64.tar.gz

 

 
 
  1. tar xf flannel-v0.9.0-linux-amd64.tar.gz 
  2.  
  3. 传到每个机器上: 
  4. scp flanneld k8s-node1:/usr/bin/ 
  5. scp flanneld k8s-node2:/usr/bin/ 
  6.  
  7. #每个机器上创建一个目录: 
  8. mkdir -p /usr/libexec/flannel 
  9.  
  10. scp mk-docker-opts.sh k8s-node1:/usr/libexec/flannel 
  11. scp mk-docker-opts.sh k8s-node2:/usr/libexec/flannel 

 

添加一个启动文件:要看启动文件中的目录,如果不存在就创建,并授权。

 
 
  1. [Unit] 
  2. Description=Flanneld overlay address etcd agent 
  3. After=network.target 
  4. After=network-online.target 
  5. Wants=network-online.target 
  6. After=etcd.service 
  7. Before=docker.service 
  8.  
  9. [Service] 
  10. Type=notify 
  11. EnvironmentFile=/etc/sysconfig/flanneld 
  12. EnvironmentFile=-/etc/sysconfig/docker-network 
  13. ExecStart=/usr/bin/flanneld-start $FLANNEL_OPTIONS 
  14. ExecStartPost=/usr/libexec/flannel/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker 
  15. Restart=on-failure 
  16.  
  17. [Install] 
  18. WantedBy=multi-user.target 
  19. RequiredBy=docker.service 

 

还要手工添加个shell文件:flanneld-start

 

 
 
  1. #!/bin/sh 
  2.  
  3. exec /usr/bin/flanneld \ 
  4.     -etcd-endpoints=${FLANNEL_ETCD_ENDPOINTS:-${FLANNEL_ETCD}} \ 
  5.     -etcd-prefix=${FLANNEL_ETCD_PREFIX:-${FLANNEL_ETCD_KEY}} \ 
  6.     "$@" 

需要可执行权限:

 
 
  1. chmod 755 /usr/bin/flanneld-start 

然后启动服务。

 

再尝试一个下效果:添加一个srevice.yaml

 

 
 
  1. apiVersion: v1 
  2. kind: Service 
  3. metadata: 
  4.   name: nginx-service 
  5. spec: 
  6.   type: NodePort 
  7.   ports: 
  8.   - port: 8000 
  9.     targetPort: 80 
  10.     protocol: TCP 
  11.   selector: 
  12.     app: nginx 

 

这里可以看到type类型为NodePort,就是这个31603端口会在每个容器运行的宿主机上映射一个对外的端口,通过宿主机IP和端口即可访问上面创建的nginx服务。

 
 
  1. [root@k8s-master yaml]# kubectl get service 
  2. NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE 
  3. kubernetes      ClusterIP   10.254.0.1      <none>        443/TCP          1d 
  4. nginx-service   NodePort    10.254.72.166   <none>        8000:31603/TCP   37m 
  5. [root@k8s-master yaml]# kubectl get po -o wide 
  6. NAME             READY     STATUS    RESTARTS   AGE       IP           NODE 
  7. nginx-rc-r6cnh   1/1       Running   0          45m       172.21.8.2   k8s-node2 
  8. nginx-rc-wp2hk   1/1       Running   0          45m       172.21.2.2   k8s-node1 

而CLUSTER-IP就是集群的IP入口,但是它只允许有容器运行在集群内的宿主机连接。


推荐阅读
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • 在 Kubernetes 中,Pod 的调度通常由集群的自动调度策略决定,这些策略主要关注资源充足性和负载均衡。然而,在某些场景下,用户可能需要更精细地控制 Pod 的调度行为,例如将特定的服务(如 GitLab)部署到特定节点上,以提高性能或满足特定需求。本文深入解析了 Kubernetes 的亲和性调度机制,并探讨了多种优化策略,帮助用户实现更高效、更灵活的资源管理。 ... [详细]
  • Docker 环境下 MySQL 双主同步配置指南
    本文介绍了如何在 Docker 环境中配置 MySQL 的双主同步,包括目录结构的创建、配置文件的编写、容器的创建与设置以及最终的验证步骤。 ... [详细]
  • 一、Tomcat安装后本身提供了一个server,端口配置默认是8080,对应目录为:..\Tomcat8.0\webapps二、Tomcat8.0配置多个端口,其实也就是给T ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 体积小巧的vsftpd与pureftpd Docker镜像在Unraid系统中的详细配置指南:支持TLS加密及IPv6协议
    本文详细介绍了如何在Unraid系统中配置体积小巧的vsftpd和Pure-FTPd Docker镜像,以支持TLS加密和IPv6协议。通过这些配置,用户可以实现安全、高效的文件传输服务,适用于各种网络环境。配置过程包括镜像的选择、环境变量的设置以及必要的安全措施,确保了系统的稳定性和数据的安全性。 ... [详细]
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • 申请地址:https://developer.apple.com/appstore/contact/?topic=expedite 常见申请理由:1. 我们即将发布新产品,这是一个媒体活动,我们无法承担任何风险,因此在多个方面努力提升应用质量。 ... [详细]
  • 在运行于MS SQL Server 2005的.NET 2.0 Web应用中,我偶尔会遇到令人头疼的SQL死锁问题。过去,我们主要通过调整查询来解决这些问题,但这既耗时又不可靠。我希望能找到一种确定性的查询模式,确保从设计上彻底避免SQL死锁。 ... [详细]
  • ipsec 加密流程(二):ipsec初始化操作
    《openswan》专栏系列文章主要是记录openswan源码学习过程中的笔记。Author:叨陪鲤Email:vip_13031075266163.comDate:2020.1 ... [详细]
  • JUC(三):深入解析AQS
    本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • 在 Vue 项目中,为了提高页面加载速度和优化用户体验,实现图片上传前的压缩处理至关重要。本文介绍了如何通过集成第三方库和自定义组件,有效减小图片文件大小,确保在不影响图像质量的前提下,提升应用性能。 ... [详细]
author-avatar
无正道
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有