kubeadm部署k8s_用 kubeadm 部署生產級 k8s 集群

概述

kubeadm 已?持集群部署,且在1.13 版本中 GA,?持多 master,多 etcd 集群化部署,它也是官?最為推薦的部署?式,?來是由它的 sig 組來推進的,?來 kubeadm 在很多??確實很好的利?了 kubernetes 的許多特性,接下來?篇我們來實踐并了解下它的魅?。

?標

1. 通過 kubeadm 搭建?可? kubernetes 集群,并新建管理?戶

2. 為后續做版本升級演示,此處使?1.13.1版本,到下?篇再升級到 v1.14

3. kubeadm 的原理解讀

本?主要介紹 kubeadm 對?可?集群的部署

kubeadm 部署 k8s v1.13 ?可?集群

?式有兩種

  • Stacked etcd topology
25f31e1c0f3a235b848074b6d1a20dc1.png
  • 即每臺 etcd 各?獨?,分別部署在 3 臺 master 上,互不通信,優點是簡單,缺點是缺乏 etcd ?可?性
  • 需要?少 4 臺機器(3master 和 etcd,1node)
  • External etcd topology
c8412934d8e93380bdf3031406b80bfd.png
  • 即采?集群外 etcd 拓撲結構,這樣的冗余性更好,但需要?少7臺機器(3master,3etcd,1node)
  • ?產環境建議采?該?案
  • 本?也采?這個拓撲

步驟

  • 環境準備
  • 安裝組件:docker,kubelet,kubeadm(所有節點)
  • 使?上述組件部署 etcd ?可?集群
  • 部署 master
  • 加?node
  • ?絡安裝
  • 驗證
  • 總結

機環境準備

  • 系統環境
#操作系統版本(?必須,僅為此處案例)$cat /etc/redhat-releaseCentOS Linux release 7.2.1511 (Core)#內核版本(?必須,僅為此處案例)$uname -r4.17.8-1.el7.elrepo.x86_64#數據盤開啟ftype(在每臺節點上執?)umount /datamkfs.xfs -n ftype=1 -f /dev/vdb#禁?swapswapoff -ased -i "s#^/swapfile##/swapfile#g" /etc/fstabmount -a

docker,kubelet,kubeadm 的安裝(所有節點)

安裝運?時(docker)

  • k8s1.13 版本根據官?建議,暫不采?最新的 18.09,這?我們采?18.06,安裝時需指 定版本
  • 來源:kubeadm now properly recognizes Docker 18.09.0 and newer, but still treats 18.06 as the default supported version.
  • 安裝腳本如下(在每臺節點上執?):
f703dd43e8fc84d884d38d687fac14a7.png

安裝 kubeadm,kubelet,kubectl

  • 官?的 Google yum 源?法從國內服務器上直接下載,所以可先在其他渠道下載好,在上傳到服務器上
cat < /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=1repo_gpgcheck=1gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpghttps://packages.cloud.google.com/yum/doc/rpm-package-key.gpgexclude=kube*EOF$ yum -y install --downloadonly --downloaddir=k8s kubelet-1.13.1 kubeadm-1.13.1kubectl-1.13.1$ ls k8s/25cd948f63fea40e81e43fbe2e5b635227cc5bbda6d5e15d42ab52decf09a5ac-kubelet-1.13.1-0.x86_64.rpm53edc739a0e51a4c17794de26b13ee5df939bd3161b37f503fe2af8980b41a89-cri-tools-1.12.0-0.x86_64.rpm5af5ecd0bc46fca6c51cc23280f0c0b1522719c282e23a2b1c39b8e720195763-kubeadm-1.13.1-0.x86_64.rpm7855313ff2b42ebcf499bc195f51d56b8372abee1a19bbf15bb4165941c0229d-kubectl-1.13.1-0.x86_64.rpmfe33057ffe95bfae65e2f269e1b05e99308853176e24a4d027bc082b471a07c0-kubernetes-cni-0.6.0-0.x86_64.rpmsocat-1.7.3.2-2.el7.x86_64.rpm
  • 本地安裝
# 禁?selinuxsetenforce 0sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config# 本地安裝yum localinstall -y k8s/*.rpmsystemctl enable --now kubelet
  • ?絡修復,已知 centos7 會因 iptables 被繞過?將流量錯誤路由,因此需確保sysctl 配置中的 net.bridge.bridgenf-call-iptables 被設置為 1
cat < /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOFsysctl --system

使?上述組件部署 etcd ?可?集群

1. 在 etcd 節點上,將 etcd 服務設置為由 kubelet 啟動管理

cat << EOF > /etc/systemd/system/kubelet.service.d/20-etcd-service-manager.conf[Service]ExecStart=ExecStart=/usr/bin/kubelet --address=127.0.0.1 --pod-manifestpath=/etc/kubernetes/manifests --allow-privileged=trueRestart=alwaysEOFsystemctl daemon-reloadsystemctl restart kubelet

2. 給每臺 etcd 主機?成 kubeadm 配置?件,確保每臺主機運??個 etcd 實例:在 etcd1(即上述的 hosts0)上執?上述

命令,可以在 /tmp ?錄下看到?個主機名的?錄

# Update HOST0, HOST1, and HOST2 with the IPs or resolvable names of your hostsexport HOST0=10.10.184.226export HOST1=10.10.213.222export HOST2=10.10.239.108# Create temp directories to store files that will end up on other hosts.mkdir -p /tmp/${HOST0}/ /tmp/${HOST1}/ /tmp/${HOST2}/ETCDHOSTS=(${HOST0} ${HOST1} ${HOST2})NAMES=("infra0" "infra1" "infra2")?
460e451fe34777a91a7f1b4176553a38.png

3. 制作 CA:在host0上執?命令?成證書,它將創建兩個?件:/etc/kubernetes/pki/etcd/ca.crt/etc/kubernetes/pki/etcd/ca.key (這?步需要翻墻)

[root@10-10-184-226 ~]# kubeadm init phase certs etcd-ca[certs] Generating "etcd/ca" certificate and key

4. 在 host0 上給每個 etcd 節點?成證書:

export HOST0=10.10.184.226export HOST1=10.10.213.222export HOST2=10.10.239.108kubeadm init phase certs etcd-server --config=/tmp/${HOST2}/kubeadmcfg.yamlkubeadm init phase certs etcd-peer --config=/tmp/${HOST2}/kubeadmcfg.yamlkubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST2}/kubeadmcfg.yamlkubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST2}/kubeadmcfg.yamlcp -R /etc/kubernetes/pki /tmp/${HOST2}/# cleanup non-reusable certificatesfind /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -deletekubeadm init phase certs etcd-server --config=/tmp/${HOST1}/kubeadmcfg.yamlkubeadm init phase certs etcd-peer --config=/tmp/${HOST1}/kubeadmcfg.yamlkubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST1}/kubeadmcfg.yamlkubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST1}/kubeadmcfg.yamlcp -R /etc/kubernetes/pki /tmp/${HOST1}/find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -deletekubeadm init phase certs etcd-server --config=/tmp/${HOST0}/kubeadmcfg.yamlkubeadm init phase certs etcd-peer --config=/tmp/${HOST0}/kubeadmcfg.yamlkubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST0}/kubeadmcfg.yamlkubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST0}/kubeadmcfg.yaml# No need to move the certs because they are for HOST0# clean up certs that should not be copied off this hostfind /tmp/${HOST2} -name ca.key -type f -deletefind /tmp/${HOST1} -name ca.key -type f -delete
  • 將證書和 kubeadmcfg.yaml 下發到各個 etcd 節點上效果為
3192c6f68fff8521bacfe6742aca8a96.png

5. ?成靜態 pod manifest ,在 3 臺 etcd 節點上分別執?:(需翻墻)

$ kubeadm init phase etcd local --config=/root/kubeadmcfg.yaml[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"

6. 檢查 etcd 集群狀態,?此 etcd 集群搭建完成

docker run --rm -it --net host -v /etc/kubernetes:/etc/kubernetesk8s.gcr.io/etcd:3.2.24 etcdctl --cert-file /etc/kubernetes/pki/etcd/peer.crt --keyfile /etc/kubernetes/pki/etcd/peer.key --ca-file /etc/kubernetes/pki/etcd/ca.crt --endpoints https://${HOST0}:2379 cluster-healthmember 9969ee7ea515cbd2 is healthy: got healthy result fromhttps://10.10.213.222:2379member cad4b939d8dfb250 is healthy: got healthy result fromhttps://10.10.239.108:2379member e6e86b3b5b495dfb is healthy: got healthy result fromhttps://10.10.184.226:2379cluster is healthy

使? kubeadm 部署 master

  • 將任意?臺 etcd 上的證書拷?到 master1 節點
export CONTROL_PLANE="ubuntu@10.0.0.7"+scp /etc/kubernetes/pki/etcd/ca.crt "${CONTROL_PLANE}":+scp /etc/kubernetes/pki/apiserver-etcd-client.crt "${CONTROL_PLANE}":+scp /etc/kubernetes/pki/apiserver-etcd-client.key "${CONTROL_PLANE}":
  • 在第?臺 master 上編寫配置?件 kubeadm-config.yaml 并初始化
c9da00c436c1514d5bc893492ad76b8a.png

注意:這?的 k8s.paas.test:6443 是?個 LB,如果沒有可?虛擬 IP 來做

  • 使?私有倉庫(?定義鏡像功能) kubeadm ?持通過修改配置?件中的參數來靈活定制集群初始化?作,如 imageRepository 可以設置鏡像前綴,我們可以在將鏡像傳到??內部私服上之后,編輯 kubeadm-config.yaml 中的該參數之后再執? init
  • 在 master1 上執?:kubeadm init --config kubeadm-config.yaml
c819b2a2b61a6b44138ae09e18d64d8f.png

安裝另外2臺 master

  • master1 上的 admin.conf 配置?件和 pki 相關證書拷?到另外 2 臺 master 同樣?錄下如:
/etc/kubernetes/pki/ca.crt/etc/kubernetes/pki/ca.key/etc/kubernetes/pki/sa.key/etc/kubernetes/pki/sa.pub/etc/kubernetes/pki/front-proxy-ca.crt/etc/kubernetes/pki/front-proxy-ca.key/etc/kubernetes/pki/etcd/ca.crt/etc/kubernetes/pki/etcd/ca.key (官??檔中此處需要拷?,但實際不需要)/etc/kubernetes/admin.conf

注:官??檔少了兩個?件/etc/kubernetes/pki/apiserver-etcd-client.crt /etc/kubernetes/pki/apiserver-etcdclient.key,不加 apiserver 會啟動失敗并報錯:

Unable to create storage backend: config (&{ /registry []/etc/kubernetes/pki/apiserver-etcd-client.key /etc/kubernetes/pki/apiserver-etcdclient.crt /etc/kubernetes/pki/etcd/ca.crt true 0xc000133c20  5m0s 1m0s}),err (open /etc/kubernetes/pki/apiserver-etcd-client.crt: no such file ordirectory)
  • 在 2 和 3 master 中執?加?:
fb164f43374c6c074f19eed58ac2c67e.png

加? node 節點

[root@k8s-n1 ~]$ kubeadm join k8s.paas.test:6443 --token f1oygc.3zlc31yjcut46prf --discovery-tokenca-cert-hash sha256:078b63e29378fb6dcbedd80dd830b83e37521f294b4e3416cd77e854041d912f[preflight] Running pre-flight checks[discovery] Trying to connect to API Server "k8s.paas.test:6443"[discovery] Created cluster-info discovery client, requesting info from"https://k8s.paas.test:6443"[discovery] Requesting info from "https://k8s.paas.test:6443" again to validate TLSagainst the pinned public key[discovery] Cluster info signature and contents are valid and TLS certificatevalidates against pinned roots, will use API Server "k8s.paas.test:6443"[discovery] Successfully established connection with API Server "k8s.paas.test:6443"[join] Reading configuration from the cluster...[join] FYI: You can look at this config file with 'kubectl -n kube-system get cmkubeadm-config -oyaml'[kubelet] Downloading configuration for the kubelet from the "kubelet-config-1.13"ConfigMap in the kube-system namespace[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"[kubelet-start] Writing kubelet environment file with flags to file"/var/lib/kubelet/kubeadm-flags.env"[kubelet-start] Activating the kubelet service[tlsbootstrap] Waiting for the kubelet to perform the TLS Bootstrap...[patchnode] Uploading the CRI Socket information "/var/run/dockershim.sock" to theNode API object "k8s-n1" as an annotation?This node has joined the cluster:* Certificate signing request was sent to apiserver and a response was received.* The Kubelet was informed of the new secure connection details.?Run 'kubectl get nodes' on the master to see this node join the cluster.

網絡安裝

kubectl apply -fhttps://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.ymlkubectl get pod --all-namespaces -o wideNAMESPACE NAME READY STATUS RESTARTS AGEIP NODE NOMINATED NODE READINESS GATESkube-system coredns-86c58d9df4-dc4t2 1/1 Running 0 14m172.17.0.3 k8s-m1 kube-system coredns-86c58d9df4-jxv6v 1/1 Running 0 14m172.17.0.2 k8s-m1 kube-system kube-apiserver-k8s-m1 1/1 Running 0 13m10.10.119.128 k8s-m1 kube-system kube-apiserver-k8s-m2 1/1 Running 0 5m10.10.76.80 k8s-m2 kube-system kube-apiserver-k8s-m3 1/1 Running 0 4m58s10.10.56.27 k8s-m3 kube-system kube-controller-manager-k8s-m1 1/1 Running 0 13m10.10.119.128 k8s-m1 kube-system kube-controller-manager-k8s-m2 1/1 Running 0 5m10.10.76.80 k8s-m2 kube-system kube-controller-manager-k8s-m3 1/1 Running 0 4m58s10.10.56.27 k8s-m3 kube-system kube-flannel-ds-amd64-nvmtk 1/1 Running 0 44s10.10.56.27 k8s-m3 kube-system kube-flannel-ds-amd64-pct2g 1/1 Running 0 44s10.10.76.80 k8s-m2 kube-system kube-flannel-ds-amd64-ptv9z 1/1 Running 0 44s10.10.119.128 k8s-m1 kube-system kube-flannel-ds-amd64-zcv49 1/1 Running 0 44s10.10.175.146 k8s-n1 kube-system kube-proxy-9cmg2 1/1 Running 0 2m34s10.10.175.146 k8s-n1 kube-system kube-proxy-krlkf 1/1 Running 0 4m58s10.10.56.27 k8s-m3 kube-system kube-proxy-p9v66 1/1 Running 0 14m10.10.119.128 k8s-m1 kube-system kube-proxy-wcgg6 1/1 Running 0 5m10.10.76.80 k8s-m2 kube-system kube-scheduler-k8s-m1 1/1 Running 0 13m10.10.119.128 k8s-m1 kube-system kube-scheduler-k8s-m2 1/1 Running 0 5m10.10.76.80 k8s-m2 kube-system kube-scheduler-k8s-m3 1/1 Running 0 4m58s10.10.56.27 k8s-m3 

安裝完成

驗證

  • ?先驗證 kube-apiserver, kube-controller-manager, kube-scheduler, pod network 是否正常:
$kubectl create deployment nginx --image=nginx:alpine$kubectl get pods -l app=nginx -o wideNAME READY STATUS RESTARTS AGE IP NODENOMINATED NODE READINESS GATESnginx-54458cd494-r6hqm 1/1 Running 0 5m24s 10.244.4.2 k8s-n1
  • kube-proxy 驗證
$kubectl expose deployment nginx --port=80 --type=NodePortservice/nginx exposed?[root@k8s-m1 ~]$kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1  443/TCP 122mnginx NodePort 10.108.192.221  80:30992/TCP 4s[root@k8s-m1 ~]$kubectl get pods -l app=nginx -o wideNAME READY STATUS RESTARTS AGE IP NODENOMINATED NODE READINESS GATESnginx-54458cd494-r6hqm 1/1 Running 0 6m53s 10.244.4.2 k8s-n1?$curl -I k8s-n1:30992HTTP/1.1 200 OK
  • 驗證 dns,pod ?絡狀態
kubectl run --generator=run-pod/v1 -it curl --image=radial/busyboxplus:curlIf you don't see a command prompt, try pressing enter.[ root@curl:/ ]$ nslookup nginxServer: 10.96.0.10Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.localName: nginxAddress 1: 10.108.192.221 nginx.default.svc.cluster.local
  • ?可?

關機 master1,在?個隨機 pod 中訪問 Nginx 關機 master1,在?個隨機 pod 中訪問 Nginx

while true;do curl -I nginx && sleep 1 ;done

總結

關于版本

  • 內核版本 4.19 更加穩定此處不建議4.17(再新就是5了)
  • docker 最新穩定版是 1.17.12,此處是 1.18.06,雖 k8s 官?也確認兼容1.18.09 了但?產上還是建議 1.17.12

關于?絡,各家選擇不同,flannel 在中?公司較為普遍,但部署前要選好?絡插件,在配置?件中提前設置好(官?博客?開始的 kubeadm 配置中沒寫,后?在?絡設置中?要求必須加)

出錯處理

  • 想重置環境的話,kubeadm reset 是個很好的?具,但它并不會完全重置,在etcd 中的的部分數據(如 configmap secure 等)是沒有被清空的,所以如果有必要重置真個環境,記得在 reset 后將 etcd 也重置。
  • 重置 etcd 辦法為清空 etcd 節點 /var/lib/etcd,重啟 docker 服務)

翻墻

  • 鏡像:kubeadm 已?持?定義鏡像前綴,kubeadm-config.yaml 中設置 imageRepository 即可
  • yum,可提前下載導?,也可以設置 http_proxy 來訪問
  • init,簽發證書和 init 時需要連接 google,也可以設置 http_proxy來訪問。

更多

  • 證書、升級問題將在下?篇繼續介紹。

參考:

  • https://kubernetes.io/docs/setup/independent/setup-ha-etcd-with-kubeadm/

想要加群的可以添加WeChat:18310139238

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276831.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276831.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276831.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

poj 題目分類

1000 AB Problem 送分題 1001 Exponentiation 高精度 1003 Hangover 送分題 1004 Financial Management 送分題 1005 I Think I Need a Houseboat 幾何 1006 Biorhythms 送分題 1007 …

模板的語法

我已經碰到過好幾次這種錯誤了. template<typename R>static_inline vec4<typename R::scalar>point(constrhs2<R>&v) { returnvec4<P>(v.x, v.y, 0, 1); } template<typename R>static_inline vec4<typename R::sca…

統計學習方法概論---分類問題

為什么80%的碼農都做不了架構師&#xff1f;>>> 分類問題 轉載于:https://my.oschina.net/liyangke/blog/2945185

IEPLUS(IE增強性插件)

用Vista好長好長時間了&#xff0c;除了比較吃硬件、老的游戲不兼容、我350W像素的老羅技不能用等等&#xff0c;感覺不是非常不錯的。IE 7也還可以&#xff0c;后來我試用了傲游、火狐&#xff0c;在多標簽后傲游的一些操作更人性化&#xff0c;我最喜歡它的托拉即可自動出新標…

CENTOS7 Python3.7 PyAudio 安裝

2019獨角獸企業重金招聘Python工程師標準>>> 出現錯誤: gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -fPIC -I/usr/local/python371/include/python3.7m -c src/_portaudiomodule.c -o build/temp.linux-aarch64-3.7/src/…

bash for循環_Bash 中的 For 循環

循環是編程語言的基本概念之一。當你想要一遍又一遍地運行一系列命令直到達到某個條件后終止退出時&#xff0c;循環很方便。在諸如 Bash 之類的腳本語言中&#xff0c;循環對于自動執行重復性任務非常有用。在 Bash 腳本中有3個基本的循環結構&#xff0c;for 循環&#xff0c…

Atlas Unknown Error

if("using Atlas" and "there are some js codes in HEAD tag") then "Unknown Error" solution: copy the js codes to other position 轉載于:https://www.cnblogs.com/JoeHou/archive/2009/02/03/1383231.html

軟件工程師的6年總結

“又是一年畢業時”&#xff0c;看到一批批學子離開人生的象牙塔&#xff0c;走上各自的工作崗位&#xff1b;想想自己也曾經意氣風發、躊躇滿志&#xff0c;不覺感嘆萬千……本文是自己工作6年的經歷沉淀或者經驗提煉&#xff0c;希望對所有的軟件工程師們有所幫助&#xff0c…

linux 信號_Linux的信號和線程

Linux的信號和線程-Tech Talk 讓技術發出聲音?www.ttalk.im什么是線程線程&#xff0c;有時被稱為輕量級進程(Lightweight Process&#xff0c;LWP&#xff09;&#xff0c;是程序執行流的最小單元。一個標準的線程由線程ID&#xff0c;當前指令指針(PC&#xff09;&#xff0…

tomcat部署教程

參考博客地址&#xff1a; https://blog.csdn.net/xiaoyu940601/article/details/54950673轉載于:https://www.cnblogs.com/liuniublogs/p/10019068.html

選擇文字就能選擇復選框

更方便的單選框下面為腳本顯示區  看看下面的選擇框&#xff0c;似乎沒有什么不同的。微妙之處在于&#xff0c;選擇項目時不必非得在框內點擊鼠標了&#xff0c;在文本上選擇即可。不信試一試吧。 經常來這里 偶爾來看看 轉載于:https://www.cnblogs.com/leevane/archive/200…

python 數據結構

一. 深入鏈表 先來介紹一些鏈表具備的一些常用方法&#xff1a; append(x) : 把一個元素添加到鏈表的結尾 extend(L) : 將另外一個鏈表合并到該鏈表中 insert(i,x) : 插入一個元素到指定位置的前面 remove(x) : 刪除鏈表中第一個值為x的元素 如果沒有這樣的元素 則返回錯誤 pop…

python筆試編程題_Python——面試編程題

一、python----輸出1-100之和的方法 方法一&#xff1a; print(sum(range(1,101))) 方法二&#xff1a; from functools import reduce print(reduce(lambda x, y: xy, range(101))) 方法三: t0 for i in range(101): ti print(t) 方法四&#xff1a; print(sum([x for x in ra…

go語言項目優化(經驗之談)

1 Go的應用場景 在斗魚我們將GO的應用場景分為以下三類&#xff0c;緩存類型數據&#xff0c;實時類型數據&#xff0c;CPU密集型任務。這三類應用場景都有著各自的特點。 ● 緩存類型數據在斗魚的案例就是我們的首頁&#xff0c;列表頁&#xff0c;這些頁面和接口的特點是不同…

AddTransient、AddSingleton、AddScoped 三者都應該在什么場景下使用

網上隨便一搜&#xff0c;能搜出一大堆對三者進行區別分析的文章&#xff0c;但是呢&#xff0c;理論是一回事&#xff0c;實際使用又是另外一回事&#xff0c;到底在何種場景下應該使用何種注入方式呢&#xff1f; 通過這篇文章和我自身的實際經驗&#xff0c;來說一說實際應用…

python交互界面用圖片當背景_wxPython實現窗口用圖片做背景

本文實例為大家分享了wxPython實現窗口用圖片做背景的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下 效果圖&#xff1a;實現代碼&#xff1a; #!/usr/bin/env python # -*- encoding:utf-8 -*- import wx class MyPanel(wx.Panel): def __init__(self,parent,id): …

css超出隱藏顯示省略號

width: 300px; overflow: hidden;/*超出部分隱藏*/ text-overflow:ellipsis;/* 超出部分顯示省略號 */ white-space: nowrap;/*規定段落中的文本不進行換行 */ 轉載于:https://www.cnblogs.com/songmengwen1124/p/11354620.html

信號為E時,如何讓語音識別脫“網”而出?

歡迎大家前往騰訊云社區&#xff0c;獲取更多騰訊海量技術實踐干貨哦~ 本文由騰訊教育云發表于云社區專欄 一般沒有網絡時&#xff0c;語音識別是這樣的 ▽ 而同等環境下&#xff0c;嵌入式語音識別&#xff0c;是這樣的 ▽ 不僅可以幫您邊說邊識、出口成章&#xff0c;有個性化…

TwinSocketStream

使用TwinSocketStream 當為一個blocking連接實現一個線程時,你必須確定在連接的另一端的socket是準備寫還是讀.Blocking連接不會通知socket當它準備好寫或讀操作的時候.想看看連接是否準備好,使用TWinSocketStream對象.TWinSocketStream提供一個方法去幫助調整讀或寫操作時間的…