<dd id="mjpng"><output id="mjpng"><nav id="mjpng"></nav></output></dd>

      <optgroup id="mjpng"></optgroup><span id="mjpng"></span>

      <optgroup id="mjpng"><li id="mjpng"><del id="mjpng"></del></li></optgroup>
    1. <span id="mjpng"><output id="mjpng"></output></span>
          • 自動秒收錄
          • 軟件:1973
          • 資訊:57811|
          • 收錄網站:279872|

          IT精英團

          如何優雅地修改Kubernetes主節點IP?但是沒你想的那么簡單!

          如何優雅地修改Kubernetes主節點IP?但是沒你想的那么簡單!

          瀏覽次數:
          評論次數:
          編輯: 澤洋
          信息來源: ITPUB
          更新日期: 2022-08-01 21:24:44
          摘要

          昨天網絡環境出了點問題,本地的虛擬機搭建的Kubernetes環境沒有固定IP,結果節點IP變了,當然最簡單的方式是將節點重新固定回之前的IP地址,但是自己頭鐵想去修改下集群的IP地

          • 正文開始
          • 相關閱讀
          • 推薦作品

          昨天網絡環境出了點問題。由本地虛擬機構建的Kubernetes環境沒有固定的IP。因此,節點的IP發生了變化。當然,最簡單的方法是將節點固定回以前的IP地址,但是我嘗試修改集群的IP地址。結果一路下來踩了好多坑。根本沒那么簡單~

          環境

          先看之前的環境:

          ~卡特彼勒/etc/hosts

          192.168

          192.168 . 0.109節點1

          節點2

          新IP地址:

          ~卡特彼勒/etc/hosts

          192.168

          192.168 . 0.101節點1

          192.168 . 0.105節點2

          所以我們需要修改所有節點的IP地址。

          操作

          首先,將所有節點的/etc/hosts更改為新地址。

          提示:強烈建議先備份在操作任何文件之前。

          主網點

          備份/etc/kubernetes目錄。CP-Rf/etc/kubernetes//etc/kubernetes-bak

          替換/etc/kubernetes中所有配置文件的APIServer地址。oldip=192.168.0.111

          newip=192.168.0.106

          #檢查以前的

          找到。-typef|xargsgrep$oldip

          #替換IP地址

          找到。-typef | xargssed-I ' s/$ oldip/$ newip/'

          #檢查更新的

          找到。-typef|xargsgrep$newip

          在/etc/kubernetes/pki中將舊的IP地址標識為alt name。cd/etc/kubernetes/pki

          forfin$(find-name'*。CRT’);做

          OpenSSL x509-in $ f-text-noout $ f . txt;

          完成的

          grep-Rl$oldip。

          forfin$(find-name'*。CRT’);宿舍$ f.txt完成的

          查找nbsp

          ;kube-system 命名空間中引用舊 IP 的 ConfigMap。
          # 獲取所有的 kube-system 命名空間下面所有的 ConfigMap
          ? configmaps=$(kubectl -n kube-system get cm -o name | \
            awk '{print $1}' | \
            cut -d '/' -f 2)

          # 獲取所有的ConfigMap資源清單
          ? dir=$(mktemp -d)
          ? for cf in $configmaps; do
            kubectl -n kube-system get cm $cf -o yaml > $dir/$cf.yaml
          done

          # 找到所有包含舊 IP 的 ConfigMap
          ? grep -Hn $dir/* -e $oldip

          # 然后編輯這些 ConfigMap,將舊 IP 替換成新的 IP
          ? kubectl -n kube-system edit cm kubeadm-config
          ? kubectl -n kube-system edit cm kube-proxy

          這一步非常非常重要,我在操作的時候忽略了這一步,導致 Flannel CNI 啟動不起來,一直報錯,類似下面的日志信息:

          ? kubectl logs -f kube-flannel-ds-pspzf -n kube-system
          I0512 14:46:26.044229       1 main.go:205] CLI flags config: {etcdEndpoints:http://127.0.0.1:4001,http://127.0.0.1:2379 etcdPrefix:/coreos.com/network etcdKeyfile: etcdCertfile: etcdCAFile: etcdUsername: etcdPassword: version:false kubeSubnetMgr:true kubeApiUrl: kubeAnnotationPrefix:flannel.alpha.coreos.com kubeConfigFile: iface:[ens33] ifaceRegex:[] ipMasq:true subnetFile:/run/flannel/subnet.env publicIP: publicIPv6: subnetLeaseRenewMargin:60 healthzIP:0.0.0.0 healthzPort:0 iptablesResyncSeconds:5 iptablesForwardRules:true netConfPath:/etc/kube-flannel/net-conf.json setNodeNetworkUnavailable:true}
          W0512 14:46:26.044617       1 client_config.go:614] Neither --kubeconfig nor --master was specified.  Using the inClusterConfig.  This might not work.
          E0512 14:46:56.142921       1 main.go:222] Failed to create SubnetManager: error retrieving pod spec for 'kube-system/kube-flannel-ds-pspzf': Get "https://10.96.0.1:443/api/v1/namespaces/kube-system/pods/kube-flannel-ds-pspzf": dial tcp 10.96.0.1:443: i/o timeout

          其實就是連不上 apiserver,排查了好久才想起來查看 kube-proxy 的日志,其中出現了如下所示的錯誤信息:

          E0512 14:53:03.260817       1 reflector.go:138] k8s.io/client-go/informers/factory.go:134: Failed to watch *v1.EndpointSlice: failed to list *v1.EndpointSlice: Get "https://192.168.0.111:6443/apis/discovery.k8s.io/v1/endpointslices?labelSelector=%21service.kubernetes.io%2Fheadless%2C%21service.kubernetes.io%2Fservice-proxy-name&limit=500&resourceVersion=0": dial tcp 192.168.0.111:6443: connect: no route to host

          這就是因為 kube-proxy 的 ConfigMap 中配置的 apiserver 地址是舊的 IP 地址,所以一定要將其替換成新的。

          1. 刪除第3步中 grep 出的證書和私鑰,重新生成這些證書。
          ? cd /etc/kubernetes/pki
          ? rm apiserver.crt apiserver.key
          ? kubeadm init phase certs apiserver

          ? rm etcd/peer.crt etcd/peer.key
          ? kubeadm init phase certs etcd-peer

          當然也可以全部重新生成:

          ? kubeadm init phase certs all
          1. 生成新的 kubeconfig 文件。
          ? cd /etc/kubernetes
          ? rm -f admin.conf kubelet.conf controller-manager.conf scheduler.conf
          ? kubeadm init phase kubeconfig all
          I0513 15:33:34.404780   52280 version.go:255] remote version is much newer: v1.24.0; falling back to: stable-1.22
          [kubeconfig] Using kubeconfig folder "/etc/kubernetes"
          [kubeconfig] Writing "admin.conf" kubeconfig file
          [kubeconfig] Writing "kubelet.conf" kubeconfig file
          [kubeconfig] Writing "controller-manager.conf" kubeconfig file
          [kubeconfig] Writing "scheduler.conf" kubeconfig file
          # 覆蓋默認的 kubeconfig 文件
          ? cp /etc/kubernetes/admin.conf $HOME/.kube/config
          1. 重啟 kubelet。
          ? systemctl restart containerd
          ? systemctl restart kubelet

          正?,F在可以訪問的 Kubernetes 集群了。

          ? kubectl get nodes
          NAME      STATUS     ROLES                  AGE   VERSION
          master1   Ready      control-plane,master   48d   v1.22.8
          node1     NotReady   <none>                 48d   v1.22.8
          node2     NotReady   <none>                 48d   v1.22.8

          node 節點

          雖然現在可以訪問集群了,但是我們可以看到 Node 節點現在處于 NotReady 狀態,我們可以去查看 node2 節點的 kubelet 日志:

          ? journalctl -u kubelet -f
          ......
          May 13 15:47:55 node2 kubelet[1194]: E0513 15:47:55.470896    1194 kubelet.go:2412] "Error getting node" err="node \"node2\" not found"
          May 13 15:47:55 node2 kubelet[1194]: E0513 15:47:55.531695    1194 reflector.go:138] k8s.io/client-go/informers/factory.go:134: Failed to watch *v1.Service: failed to list *v1.Service: Get "https://192.168.0.111:6443/api/v1/services?limit=500&resourceVersion=0": dial tcp 192.168.0.111:6443: connect: no route to host
          May 13 15:47:55 node2 kubelet[1194]: E0513 15:47:55.571958    1194 kubelet.go:2412] "Error getting node" err="node \"node2\" not found"
          May 13 15:47:55 node2 kubelet[1194]: E0513 15:47:55.673379    1194 kubelet.go:2412] "Error getting node" err="node \"node2\" not found"

          可以看到仍然是在訪問之前的 APIServer 地址,那么在什么地方會明確使用 APIServer 的地址呢?我們可以通過下面的命令來查看 kubelet 的啟動參數:

          ? systemctl status kubelet
          ● kubelet.service - kubelet: The Kubernetes Node Agent
             Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
            Drop-In: /usr/lib/systemd/system/kubelet.service.d
                     └─10-kubeadm.conf
             Active: active (running) since Fri 2022-05-13 14:37:31 CST; 1h 13min ago
               Docs: https://kubernetes.io/docs/
           Main PID: 1194 (kubelet)
              Tasks: 15
             Memory: 126.9M
             CGroup: /system.slice/kubelet.service
                     └─1194 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kub...

          May 13 15:51:08 node2 kubelet[1194]: E0513 15:51:08.787677    1194 kubelet.go:2412] "Error getting node" err="node \"node2... found"
          May 13 15:51:08 node2 kubelet[1194]: E0513 15:51:08.888194    1194 kubelet.go:2412] "Error getting node" err="node \"node2... found"
          ......

          其核心配置文件為 /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf,內容如下所示:

          ? cat /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
          # Note: This dropin only works with kubeadm and kubelet v1.11+
          [Service]
          Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
          Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
          # This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
          EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
          # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
          # the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
          EnvironmentFile=-/etc/sysconfig/kubelet
          ExecStart=
          ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

          其中有一個配置 KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf,這里提到了兩個配置文件 bootstrap-kubelet.conf 與 kubelet.conf,其中第一個文件不存在:

          ? cat /etc/kubernetes/bootstrap-kubelet.conf
          cat: /etc/kubernetes/bootstrap-kubelet.conf: No such file or directory

          而第二個配置文件就是一個 kubeconfig 文件的格式,這個文件中就指定了 APIServer 的地址,可以看到還是之前的 IP 地址:

          ? cat /etc/kubernetes/kubelet.conf
          apiVersion: v1
          clusters:
          - cluster:
              certificate-authority-data: <......>
              server: https://192.168.0.111:6443
            name: default-cluster
          contexts:
          - context:
              cluster: default-cluster
              namespace: default
              user: default-auth
            name: default-context
          current-context: default-context
          kind: Config
          preferences: {}
          users:
          - name: default-auth
            user:
              client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem
              client-key: /var/lib/kubelet/pki/kubelet-client-current.pem

          所以我們最先想到的肯定就是去將這里的 APIServer 地址修改成新的 IP 地址,但是這顯然是有問題的,因為相關證書還是以前的,需要重新生成,那么要怎樣重新生成該文件呢?

          首先備份 kubelet 工作目錄:

          ? cp /etc/kubernetes/kubelet.conf /etc/kubernetes/kubelet.conf.bak
          ? cp -rf /var/lib/kubelet/ /var/lib/kubelet-bak

          刪除 kubelet 客戶端證書:

          ? rm /var/lib/kubelet/pki/kubelet-client*

          然后在 master1 節點(具有 /etc/kubernetes/pki/ca.key 文件的節點)去生成 kubelet.conf 文件:

          # 在master1節點
          ? kubeadm kubeconfig user --org system:nodes --client-name system:node:node2 --config kubeadm.yaml > kubelet.conf

          然后將 kubelet.conf 文件復制到 node2 節點 /etc/kubernetes/kubelet.conf,然后重新啟動 node2 節點上的 kubelet,并等待 /var/lib/kubelet/pki/kubelet-client-current.pem 重新創建。

          ? systemctl restart kubelet
          # 重啟后等待重新生成 kubelet 客戶端證書
          ? ll /var/lib/kubelet/pki/
          total 12
          -rw------- 1 root root 1106 May 13 16:32 kubelet-client-2022-05-13-16-32-35.pem
          lrwxrwxrwx 1 root root   59 May 13 16:32 kubelet-client-current.pem -> /var/lib/kubelet/pki/kubelet-client-2022-05-13-16-32-35.pem
          -rw-r--r-- 1 root root 2229 Mar 26 14:39 kubelet.crt
          -rw------- 1 root root 1675 Mar 26 14:39 kubelet.key

          最好我們可以通過手動編輯 kubelet.conf 的方式來指向輪轉的 kubelet 客戶端證書,將文件中的 client-certificate-data 和 client-key-data 替換為 /var/lib/kubelet/pki/kubelet-client-current.pem

          client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem
          client-key: /var/lib/kubelet/pki/kubelet-client-current.pem

          再次重啟 kubelet,正?,F在 node2 節點就會變成 Ready 狀態了,用同樣的方法再次去配置 node1 節點即可。

          ? kubectl get nodes
          NAME      STATUS   ROLES                  AGE   VERSION
          master1   Ready    control-plane,master   48d   v1.22.8
          node1     Ready    <none>                 48d   v1.22.8
          node2     Ready    <none>                 48d   v1.22.8

          推薦方式

          上面的操作方式雖然可以正常完成我們的需求,但是需要我們對相關證書有一定的了解。除了這種方式之外還有一種更簡單的操作。

          首先停止 kubelet 并備份要操作的目錄:

          ? systemctl stop kubelet
          ? mv /etc/kubernetes /etc/kubernetes-bak
          ? mv /var/lib/kubelet/ /var/lib/kubelet-bak

          將 pki 證書目錄保留下來:

          ? mkdir -p /etc/kubernetes
          ? cp -r /etc/kubernetes-bak/pki /etc/kubernetes
          ? rm /etc/kubernetes/pki/{apiserver.*,etcd/peer.*}
          rm: remove regular file ‘/etc/kubernetes/pki/apiserver.crt’? y
          rm: remove regular file ‘/etc/kubernetes/pki/apiserver.key’? y
          rm: remove regular file ‘/etc/kubernetes/pki/etcd/peer.crt’? y
          rm: remove regular file ‘/etc/kubernetes/pki/etcd/peer.key’? y

          現在我們使用下面的命令來重新初始化控制平面節點,但是最重要的一點是要使用 etcd 的數據目錄,可以通過 --ignore-preflight-errors=DirAvailable--var-lib-etcd 標志來告訴 kubeadm 使用預先存在的 etcd 數據。

          ? kubeadm init --config kubeadm.yaml --ignore-preflight-errors=DirAvailable--var-lib-etcd
          [init] Using Kubernetes version: v1.22.8
          [preflight] Running pre-flight checks
                  [WARNING DirAvailable--var-lib-etcd]: /var/lib/etcd is not empty
          [preflight] Pulling images required for setting up a Kubernetes cluster

          ......

          Your Kubernetes control-plane has initialized successfully!

          To start using your cluster, you need to run the following as a regular user:

            mkdir -p $HOME/.kube
            sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
            sudo chown $(id -u):$(id -g) $HOME/.kube/config

          Alternatively, if you are the root user, you can run:

            export KUBECONFIG=/etc/kubernetes/admin.conf

          You should now deploy a pod network to the cluster.
          Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
            https://kubernetes.io/docs/concepts/cluster-administration/addons/

          Then you can join any number of worker nodes by running the following on each as root:

          kubeadm join 192.168.0.106:6443 --token abcdef.0123456789abcdef \
                  --discovery-token-ca-cert-hash sha256:27993cae9c76d18a1b82b800182c4c7ebc7a704ba1093400ed886f65e709ec04

          上面的操作和我們平時去初始化集群的時候幾乎是一樣的,唯一不同的地方是加了一個 --ignore-preflight-errors=DirAvailable--var-lib-etcd 參數,意思就是使用之前 etcd 的數據。然后我們可以驗證下 APIServer 的 IP 地址是否變成了新的地址:

          ? cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
          cp: overwrite ‘/root/.kube/config’? y
          ? kubectl cluster-info
          Kubernetes control plane is running at https://192.168.0.106:6443
          CoreDNS is running at https://192.168.0.106:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

          To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

          對于 node 節點我們可以 reset 后重新加入到集群即可:

          # 在node節點操作
          ? kubeadm reset

          重置后重新 join 集群即可:

          # 在node節點操作
          ? kubeadm join 192.168.0.106:6443 --token abcdef.0123456789abcdef \
                  --discovery-token-ca-cert-hash sha256:27993cae9c76d18a1b82b800182c4c7ebc7a704ba1093400ed886f65e709ec04

          這種方式比上面的方式要簡單很多。正常操作后集群也正常了。

          ? kubectl get nodes
          NAME      STATUS   ROLES                  AGE     VERSION
          master1   Ready    control-plane,master   48d     v1.22.8
          node1     Ready    <none>                 48d     v1.22.8
          node2     Ready    <none>                 4m50s   v1.22.8

          總結

          對于 Kubernetes 集群節點的 IP 地址最好使用靜態 IP,避免 IP 變動對業務產生影響,如果不是靜態 IP,也強烈建議增加一個自定義域名進行簽名,這樣當 IP 變化后還可以直接重新映射下這個域名即可,只需要在 kubeadm 配置文件中通過 ClusterConfiguration 配置 apiServer.certSANs 即可,如下所示:

          apiVersion: kubeadm.k8s.io/v1beta3
          apiServer:
            timeoutForControlPlane: 4m0s
            certSANs:
            - api.k8s.local
            - master1
            - 192.168..106
          kind: ClusterConfiguration
          ......

          將需要進行前面的地址加入到 certSANs 中,比如這里我們額外添加了一個 api.k8s.local 的地址,這樣即使以后 IP 變了可以直接將這個域名映射到新的 IP 地址即可,同樣如果你想通過外網訪問 IP 訪問你的集群,那么你也需要將你的外網 IP 地址加進來進行簽名認證。

          本文轉載自:「k8s技術圈」,原文:https://url.hi-linux.com/PnPar,版權歸原作者所有。




          標簽:節點 地址 集群
          學習MySQL需要知道的28個技巧
          ? 上一篇 2022-08-01
          理解Docker容器退出代碼
          下一篇 ? 2022-08-01
          • 如何在Ubuntu中保留文件系統并備份當前開發板鏡像
            0閱讀 0條評論 個贊
            在Ubuntu保留文件系統或者說備份當前開發板鏡像的需求在不斷增加。比如Ubuntu文件系統需要安裝庫文件的話直接使用apt-get工具就可以下載,但由于需要下載的核心板較多,比較費時間,這時需要將安……
          • 國產核心板全志T507助力消防系統升級
            0閱讀 0條評論 個贊
            9月16日下午,位于湖南長沙市區內的中國電信大樓發生火災,建筑高度218米,現場濃煙滾滾,數十層樓體燃燒劇烈。消防救援人員趕到現場后很快將火勢控制住,目前大樓火勢已被撲滅,所幸未發現人員傷亡。湖南電信……
          • 教大家如何處理Spring Boot易流中的用戶和群體!
            0閱讀 0條評論 個贊
            1.準備工作2.用戶操作2.1添加用戶2.2修改用戶2.3刪除用戶2.4查詢用戶3.組操作3.1添加組3.2修改組3.3刪除組3.4查詢組4.查看表詳情雖然說我們在實際開發中,……
          • 從PG15開始WAL壓縮優化
            0閱讀 0條評論 個贊
            PG15傳聞中的超級令人激動的功能大多數跳票了,年初我也寫過一個關于PG15新功能跳票的文章。PG15BETA已經發出幾個月了,似乎PG15里令人激動人心的功能不多,不過從長長的新功能列表里,……
          • 深入了解美團葉子發射器開源方案
            0閱讀 0條評論 個贊
            大家好,我是樹哥。之前我們有聊過「如何設計一個分布式ID發號器」,其中有講過4種解決方案,分別是:UUID類雪花算法數據庫自增主鍵Redis原子自增美團以第2、3種解決方案為基礎,開發出……
          發表評論 共有條評論
          用戶名: 密碼:
          驗證碼: 匿名發表
          • 數據倉庫及其維度(層次)建模(ODS DWD DWS DWT ADS)
            0閱讀 0條評論 個贊
            一.數倉及其維度1.什么是數倉?數據倉庫,簡稱數倉,(DataWarehouse)。從邏輯上理解,數據庫和數倉沒有區別,都是通過數據庫軟件實現存放數據的地方,只不過從數據量來……
          • 公司排班系統遇到瓶頸?我自己造一個!
            10閱讀 0條評論 個贊
            本期名人堂我們有幸邀請到了白鯨開源的聯合創始人代立冬先生。代立冬先生與我們分享了自己社區開源的經歷,詳細介紹了一個開源項目是如何加入Apache孵化器,如何在導師的輔導下慢慢孵化、成長的過程,以及自己……
          • 漫談考試成長的探索——考試策略
            0閱讀 0條評論 個贊
            在《漫談軟件系統測試——問題解決》一文中,文章借鑒控制疫情的四大策略,總結了軟件系統質量保障的四大策略。那么在日常工作中,我們應該如何理解測試策略呢?什么是測試策略?測試策略是描述軟件開發周期的測試方……
          • JavaScript設計模式和代碼實現——單例模式
            0閱讀 0條評論 個贊
            單例模式1定義#保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。2應用時機#當一個類的實例被頻繁使用,如果重復創建這個實例,會無端消耗資源。比如dialog彈窗會被全局重復使用業務功能本……
          • Java內存區(運行時數據區)簡介
            0閱讀 0條評論 個贊
            Java虛擬機在執行Java程序的過程中會把它管理的內存劃分成若干個不同的數據區域。JDK1.8和之前的版本略有不同。下圖是JDK1.8對JVM做的改動,把方法區的具體實現----元空……
          • ASP.NET核心6框架揭示示例演示[34]:緩存整個響應內容
            0閱讀 0條評論 個贊
            我們利用ASP.NET開發的大部分API都是為了對外提供資源,對于不易變化的資源內容,針對某個維度對其實施緩存可以很好地提供應用的性能?!秲却婢彺媾c分布式緩存的使用》介紹的兩種緩存框架(本地內存緩存和……
          • MySQL查詢性能優化指數下推的七大武器
            0閱讀 0條評論 個贊
            前面已經講了MySQL的其他查詢性能優化方式,沒看過可以去了解一下:MySQL查詢性能優化七種武器之索引潛水MySQL查詢性能優化七種武器之鏈路追蹤今天要講的是MySQL的另一種查詢性能優化方式—索……
          • 卡夫卡數據丟失問題優化總結及重復消費原因分析(二)
            0閱讀 0條評論 個贊
            .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
          • 如何使用helm優雅地安裝prometheus-operator并監控k8s集群微服務
            0閱讀 0條評論 個贊
            前言:隨著云原生概念盛行,對于容器、服務、節點以及集群的監控變得越來越重要。Prometheus作為Kubernetes監控的事實標準,有著強大的功能和良好的生態。但是它不支持分布式,不支持數據……
          • Python自學教程7:字典類型有什么用
            0閱讀 0條評論 個贊
            字典是Python中的一個重要操作,如果字典玩得順,很多其他的數據類型就可以一通百通。Python字典的定義字典使用一對大括號進行定義,鍵值對之間使用逗號隔開,鍵和值使用冒號分隔。鍵必須是不可變類型,……
          • 拓撲嶺CEO雷鵬:創業不只是技術
            0閱讀 0條評論 個贊
            云計算的出現,加速了企業信息技術的發展。數據庫是最常用的基礎軟件之一,它通常能提供計算和存儲的能力。雖然分布式數據庫也做到了很好的擴展性,但它不能算是「云原生」?!冈圃鷶祿臁沟暮诵?,是要設計一種更……
          • 基于iframe的微前端框架——青田
            33閱讀 0條評論 個贊
            vivo互聯網前端團隊-JiangZuohan一、背景VAPD是一款專為團隊協作辦公場景設計的項目管理工具,實踐敏捷開發與持續交付,以「項目」為核心,融合需求、任務、缺陷等應用,使用敏捷迭代、小……
          • 談談我是如何學習SQL Server的
            0閱讀 0條評論 個贊
            談談我是如何學習SQLServer的相信很多人都想做大牛,但是你們知道這些大牛是怎樣煉成的嗎?我的一個同事做了差不多10年的.NET開發,算得上是大牛了吧?如果他遇到他熟悉的項目很快就能手到拿來,立……
          • 1 Docker安裝Nexus3
            0閱讀 0條評論 個贊
            1.1創建目錄在硬盤上創建Nexus3的主目錄:mkdir-p/Users/yygnb/dockerMe/nexus3為該目錄添加權限:chmod777-R/Users/yygnb/d……
          • 基于Flyway的數據庫版本控制實踐
            0閱讀 0條評論 個贊
            背景大家平時在開發過程中,會用Git來進行我們的代碼管理。如Git這些,使用這些版本控制系統能輕松的幫我們解決不同開發人員之間的代碼沖突處理版本回退實現軟件代碼的CI/CD等那大家考慮過么,針對數據庫……
          • 人人都能讀懂的源代碼——那些關于DOM的常見鉤子包(二)
            0閱讀 0條評論 個贊
            本文是深入淺出ahooks源碼系列文章的第十五篇,該系列已整理成文檔-地址。覺得還不錯,給個star支持一下哈,Thanks。本篇接著針對關于DOM的各個Hook封裝進行解讀。useFul……
          • 設計模式介紹——單一模式
            0閱讀 0條評論 個贊
            簡介一個類只允許創建一個對象(或實例),那么這個類就是一個單例類,這種設計模式稱作單例設計模式(SingletonDesignPattern),簡稱單例模式。單例模式保證系統內存中只存在一個對象,……
          • 用戶自定義注釋 AOP實現的日志保存(數據庫) 所有代碼都可以粘貼復制
            0閱讀 0條評論 個贊
            前言1,在一些特定的場景我們往往需要看一下接口的入參,特別是跨系統的接口調用(下發,推送),這個時候的接口入參就很重要,我們保存入參入庫,如果出問題就可以馬上定位是上游還是下游的問題(方便扯皮)2,還……
          • Linux驅動開發十六 輸入系統33543 系統附帶的輸入驅動程序
            0閱讀 0條評論 個贊
            前面兩章我們通過input子系統構建了一個按鍵類型的輸入設備的驅動,其實Linux的內核還提供了一套基于GPIO的按鍵驅動程序,和LED設備一樣,我們只需要在編譯內核的過程中進行配置然后在設備樹中定義……
          • 【高并發】從源碼角度深入分析線程池如何優雅退出
            0閱讀 0條評論 個贊
            大家好,我是冰河~~在【高并發專題】中,我們從源碼角度深度分析了線程池中那些重要的接口和抽象類、深度解析了線程池是如何創建的,ThreadPoolExecutor類有哪些屬性和內部類,以及它們對線程池……
          最近發布資訊
          更多
          五月色婷婷中文开心字幕

              <dd id="mjpng"><output id="mjpng"><nav id="mjpng"></nav></output></dd>

              <optgroup id="mjpng"></optgroup><span id="mjpng"></span>

              <optgroup id="mjpng"><li id="mjpng"><del id="mjpng"></del></li></optgroup>
            1. <span id="mjpng"><output id="mjpng"></output></span>