<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Tencat aka T3nc4t]]></title><description><![CDATA[Tencat aka T3nc4t. Đây là kênh lưu trữ, chia sẻ kiến thức, chém gió, mong mọi người ủng hộ nha.]]></description><link>https://tencat.dev</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Apr 2026 13:04:22 GMT</lastBuildDate><atom:link href="https://tencat.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Root Android Emulator - Cài Burp Suite CA để intercept HTTPS]]></title><description><![CDATA[Root Android Emulator và cài Burp Suite CA để intercept HTTPS — hướng dẫn chi tiết cho Android 12+, bao gồm AVD, root, cài chứng chỉ hệ thống và khắc phục lỗi.
Tải rootAVD về máy
git clone https://gitlab.com/newbit/rootAVD.git hoặc tải nhanh tại đây ...]]></description><link>https://tencat.dev/root-android-emulator-cai-burp-suite-ca-de-intercept-https</link><guid isPermaLink="true">https://tencat.dev/root-android-emulator-cai-burp-suite-ca-de-intercept-https</guid><category><![CDATA[Root Android]]></category><category><![CDATA[Android]]></category><category><![CDATA[Android Studio]]></category><category><![CDATA[Burpsuite  ]]></category><dc:creator><![CDATA[Andreeee]]></dc:creator><pubDate>Wed, 01 Oct 2025 11:31:50 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1759318295192/9c28db61-38e8-4d83-9006-5a8c9b521e82.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Root Android Emulator và cài Burp Suite CA để intercept HTTPS — hướng dẫn chi tiết cho Android 12+, bao gồm AVD, root, cài chứng chỉ hệ thống và khắc phục lỗi.</p>
<h2 id="heading-tai-rootavd-ve-may">Tải rootAVD về máy</h2>
<p><code>git clone https://gitlab.com/newbit/rootAVD.git</code> hoặc tải nhanh tại đây <a target="_blank" href="https://gitlab.com/newbit/rootAVD/-/archive/master/rootAVD-master.zip">rootAVD</a></p>
<h2 id="heading-tao-1-may-ao-android">Tạo 1 máy ảo Android</h2>
<p>Mở <code>Virtual Device Manager</code> lên</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759310002821/240a2ffe-d8b6-4bd7-9c78-4734441f7f63.png" alt class="image--center mx-auto" /></p>
<p>Tạo 1 máy ảo Android (ở đây tôi sẽ dùng Pixel 4)</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759310057334/226beb74-944c-4065-b1b3-bbb16b54070c.png" alt class="image--center mx-auto" /></p>
<p>Chọn phiên bản Android (tôi sẽ dùng phiên bản Android 12.0 - API 31)</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759310096243/5a86032e-07f2-4653-aa15-19d1819eae04.png" alt class="image--center mx-auto" /></p>
<p>Chạy máy ảo vừa tạo lên</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759310134610/4c86bf19-4ade-42ea-bcd2-9c6a97f96b8d.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-root-may-ao">Root máy ảo</h2>
<p>Truy cập vào thư mục chứa <code>rootAVD</code> vừa tải về</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759310260520/49901e3c-b746-4f60-a572-c4e9f1a9593a.png" alt class="image--center mx-auto" /></p>
<p>Sau đó mở <code>CMD</code> lên, gõ lệnh <code>rootAVD.bat ListAllAVDs</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759310484252/af4b8293-c032-4c63-a60a-4212540e8e4e.png" alt class="image--center mx-auto" /></p>
<p>Chạy lệnh <code>rootAVD.bat system-images\android-31\google_apis_playstore\x86_64\ramdisk.img</code> để root AVD</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759310594966/94076f91-ba04-4eda-970b-e8f915d75f7d.png" alt class="image--center mx-auto" /></p>
<p>Chờ tới khi root thành công</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759310826955/b3b259b9-0f32-4e20-948b-264e9ea42084.png" alt class="image--center mx-auto" /></p>
<p>Chạy lại Android với <code>Cold Boot</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759310868868/2bde8c6c-bc2a-4977-b389-55ef75f92079.png" alt class="image--center mx-auto" /></p>
<p>Kiểm tra nếu có ứng dụng <code>Magisk</code> là thành công</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759310995207/469e1051-72e3-45d6-93f4-199764e39582.png" alt class="image--center mx-auto" /></p>
<p>Vào <code>Settings</code> bật <code>Zygisk</code> nếu chưa được bật</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759311065827/043f52c3-c8d8-4290-9dc3-c20bb2a50c23.png" alt class="image--center mx-auto" /></p>
<p>Sau đó <code>reboot</code> lại để cấu hình được cập nhật</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759311140379/bd649443-ec61-4c62-98c3-c9973d5e5fd4.png" alt class="image--center mx-auto" /></p>
<p>Bật <code>Zygisk</code> thành công</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759311384716/746c273e-ac27-48b2-b8e3-1ef3ec9a47ea.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-cai-burp-suite-ca-de-intercept-https">Cài Burp Suite CA để intercept HTTPS</h2>
<p>Tải Burp Suite CA về máy, mở Burp Suite Browser lên và nhập URL <code>http://burp</code>. Bấm vào <code>CA Certificate</code> để tải cert về máy</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759311631715/d24bde5c-f9c2-413e-b7a7-3c9558f4ac1c.png" alt class="image--center mx-auto" /></p>
<p>Tiếp theo tải <code>AlwaysTrustUserCerts</code> tại đường dẫn <code>https://github.com/NVISOsecurity/AlwaysTrustUserCerts/releases/latest</code>.</p>
<p>Ở đây tôi sẽ dùng phiên bản <code>AlwaysTrustUserCerts_v1.3</code></p>
<p>Đẩy file lên máy ảo android bằng lệnh sau:</p>
<pre><code class="lang-bash">adb push cacert.der /sdcard
</code></pre>
<pre><code class="lang-bash">adb push AlwaysTrustUserCerts_v1.3.zip /sdcard
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759312053513/7faa3cdb-b418-490b-99bc-0b10adfc1e23.png" alt class="image--center mx-auto" /></p>
<p>Để cài đặt CA Certificate ta cần vào cài đặt như sau: <code>Settings → Security → Encryption &amp; credentials → Install a certificate → chọn CA Certificate</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759313130948/cc087732-5fc7-4d2d-aafc-1bac70d5bb00.png" alt class="image--center mx-auto" /></p>
<p>Để kiểm tra cài cert thành công hay không ta vào: <code>Settings → Security → Encryption &amp; credentials → Trusted credentials → chọn tab User</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759313335353/fa973eda-7501-4f67-ad5c-c7b54513f84e.png" alt class="image--center mx-auto" /></p>
<p>Đã cài đặt cert thành công, nhưng mục tiêu là cần đẩy cái cert này sang bên System để có thể nhiều quyền hơn.</p>
<p>Ta cài đặt module <code>AlwaysTrustUserCerts</code> vào app <code>Magisk</code> → chọn tab Modules (dưới cùng tay phải)</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759313449586/6b27f75e-cb27-4ceb-9196-ca653006c70c.png" alt class="image--center mx-auto" /></p>
<p>Chọn file <code>AlwaysTrustUserCerts_v1.3.zip</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759313468478/13ab7834-3807-4d6d-a335-344ca45901e4.png" alt class="image--center mx-auto" /></p>
<p>Sau khi cài đặt thành công thì bấm <code>Reboot</code> ở dưới</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759313528781/01ce32bc-4538-458c-9412-aed0c04cbc16.png" alt class="image--center mx-auto" /></p>
<p>Kiểm tra lại module đã hiện lên chưa</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759313581635/d661ef9e-f21c-42c8-b48a-a4e54186e98d.png" alt class="image--center mx-auto" /></p>
<p>Kiểm tra cert đã sang bên System chưa, ta vào: <code>Settings → Security → Encryption &amp; credentials → Trusted credentials → chọn tab System → kéo xuống tìm PortSwigger</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759313748303/e6e42768-30ee-4dd9-958e-659d59e590ab.png" alt class="image--center mx-auto" /></p>
<p>Như vậy ta đã cài thành công cert ^^</p>
<h2 id="heading-cau-hinh-proxy-burp-suite">Cấu hình proxy Burp Suite</h2>
<p>Để kiểm tra xem Burp Suite đã bắt được request thành công chưa, ta cấu hình proxy như sau</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759319262695/eed20c3c-ed2b-4101-8ec4-db08488612a7.png" alt class="image--center mx-auto" /></p>
<p>Sau đó, mở trình duyệt và kiểm tra request</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1759319664903/450ab9ae-13c7-4d3a-8ac4-562d8ae21959.png" alt class="image--center mx-auto" /></p>
<p>Bắt request thành công ^^<br />Tuy nhiên 1 số ứng dụng sẽ áp dụng thêm 1 số cách để ngăn chặn bắt request nên ta sẽ phải sử dụng các tools như: <code>Frida</code>, <code>Objection</code>, …  </p>
<h2 id="heading-noi-dung-tham-khao">Nội dung tham khảo</h2>
<p>Nội dung bài viết này được mình tìm hiểu, dịch, tham khảo, đúc kết và tổng hợp lại từ nhiều nguồn. Mọi người có thể xem thêm các bài viết sau:</p>
<ul>
<li><p><a target="_blank" href="https://hackmd.io/@antoinenguyen09/SJEFPs9Fh">Root Android 12.0 API Level 31 and add BurpSuite CA Certificate</a></p>
</li>
<li><p><a target="_blank" href="https://hackmd.io/nAJIgt13TjSZ5nqLR4-BiQ">How to Root Android Phone &amp; Install AlwaysTrustUserCert.zip Module?</a></p>
</li>
<li><p><a target="_blank" href="https://hackmd.io/@janlele91/BJ20xGWFn">Làm quen cùng pentest Android 😎</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Các thuật toán cân bằng tải mà bạn cần phải biết]]></title><description><![CDATA[Cân bằng tải là người hùng thầm lặng của các ứng dụng web hiệu suất cao. Để có thể tăng tối đa khả năng sử dụng, bạn cần phải biết về các thuật toán của chúng. Hãy theo dõi bài viết để xem đó là gì nhé.

1. Round Robin
Round Robin là hình thức cân bằ...]]></description><link>https://tencat.dev/cac-thuat-toan-can-bang-tai-ma-ban-can-phai-biet</link><guid isPermaLink="true">https://tencat.dev/cac-thuat-toan-can-bang-tai-ma-ban-can-phai-biet</guid><category><![CDATA[lb]]></category><category><![CDATA[Load Balancing]]></category><category><![CDATA[algorithms]]></category><dc:creator><![CDATA[Andreeee]]></dc:creator><pubDate>Wed, 17 Jul 2024 03:19:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1721187826784/7cba105d-07e7-44ff-ae00-77b8d21ac6c5.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Cân bằng tải là người hùng thầm lặng của các ứng dụng web hiệu suất cao. Để có thể tăng tối đa khả năng sử dụng, bạn cần phải biết về các thuật toán của chúng. Hãy theo dõi bài viết để xem đó là gì nhé.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1721186123277/0366cafe-ac39-424f-b674-c15141a0901c.gif" alt class="image--center mx-auto" /></p>
<h2 id="heading-1-round-robin">1. Round Robin</h2>
<p><code>Round Robin</code> là hình thức cân bằng tải đơn giản nhất, thường được cài đặt mặc định trong 1 số <code>load balancer</code>, trong đó mỗi máy chủ trong nhóm nhận được yêu cầu theo thứ tự luân phiên, tuần tự. Khi đến máy chủ cuối cùng, nó sẽ lặp lại máy chủ đầu tiên.</p>
<h2 id="heading-2-least-connections">2. Least Connections</h2>
<p>Hướng lưu lượng truy cập đến máy chủ có <code>ít kết nối hoạt động nhất</code>. Điều này đặc biệt hữu ích khi có các phiên có độ dài và nhu cầu khác nhau.</p>
<h2 id="heading-3-weighted-round-robin">3. Weighted Round Robin</h2>
<p>Tương tự như <code>Round Robin</code> nhưng chỉ định trọng số cho các máy chủ dựa trên dung lượng của chúng, hướng nhiều lưu lượng truy cập hơn đến các máy chủ mạnh hơn.</p>
<h2 id="heading-4-weighted-least-connections">4. Weighted Least Connections</h2>
<p>Kết hợp các lợi ích của <code>Least Connections</code> và <code>Weighted Round Robin</code>, xem xét cả tải và dung lượng của máy chủ.</p>
<h2 id="heading-5-ip-hash">5. IP Hash</h2>
<p>Sử dụng địa chỉ IP của khách hàng để chuyển các yêu cầu của họ đến cùng một máy chủ một cách nhất quán.</p>
<h2 id="heading-6-least-response-time">6. Least Response Time</h2>
<p>Chuyển yêu cầu đến máy chủ có thời gian phản hồi nhanh nhất và số lượng kết nối hoạt động thấp nhất.</p>
<h2 id="heading-7-random">7. Random</h2>
<p>Gửi yêu cầu đến máy chủ một cách ngẫu nhiên.</p>
<h2 id="heading-8-least-bandwidth">8. Least Bandwidth</h2>
<p>Gửi yêu cầu đến máy chủ tiêu tốn ít băng thông mạng nhất.</p>
<h2 id="heading-noi-dung-tham-khao">Nội dung tham khảo</h2>
<p>Nội dung bài viết này được mình tìm hiểu, dịch, tham khảo, đúc kết và tổng hợp lại từ nhiều nguồn. Mọi người có thể xem thêm các bài viết sau:</p>
<ul>
<li><p>Prof. C Murwamuila - <a target="_blank" href="https://www.linkedin.com/posts/activity-7217476622843559937-MZ3n">8 Essential Load Balancing Algorithms</a></p>
</li>
<li><p><a target="_blank" href="https://www.designgurus.io/">Design Gurus</a></p>
</li>
<li><p><a target="_blank" href="https://levelup.gitconnected.com/the-essential-guide-to-load-balancing-strategies-and-techniques-cb17f0d219ee">The Essential Guide to Load Balancing Strategies and Techniques | by Hayk Simonyan | Level Up Coding (gitconnected.com)</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Tổng hợp các câu lệnh hay dùng nhất Kubenetes | Kubernetes Cheat Sheet]]></title><description><![CDATA[Bài viết được mình sưu tầm với mục đích chia sẻ kiến thức cho mọi người, và không nhằm mục đích thương mại. Vì bài viết có nhiều từ tiếng anh chuyên môn nên mình sẽ để nguyên văn của tác giả để mọi người có thể hiểu dễ hơn.
Cluster Management

Displa...]]></description><link>https://tencat.dev/tong-hop-cac-cau-lenh-hay-dung-nhat-kubenetes-kubernetes-cheat-sheet</link><guid isPermaLink="true">https://tencat.dev/tong-hop-cac-cau-lenh-hay-dung-nhat-kubenetes-kubernetes-cheat-sheet</guid><category><![CDATA[k8s]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[Devops]]></category><category><![CDATA[cheatsheet]]></category><dc:creator><![CDATA[Andreeee]]></dc:creator><pubDate>Sun, 16 Jun 2024 16:19:21 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1718554158732/1eb63311-1348-4fd7-8932-51f19b9c8c29.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Bài viết được mình sưu tầm với mục đích chia sẻ kiến thức cho mọi người, và không nhằm mục đích thương mại. Vì bài viết có nhiều từ tiếng anh chuyên môn nên mình sẽ để nguyên văn của tác giả để mọi người có thể hiểu dễ hơn.</p>
<h2 id="heading-cluster-management">Cluster Management</h2>
<ol>
<li><p>Display endpoint details for the cluster’s master and services.</p>
<pre><code class="lang-bash">kubectl cluster-info
</code></pre>
</li>
<li><p>Show the Kubernetes version that is active on
the server and client</p>
<pre><code class="lang-bash">kubectl version
</code></pre>
</li>
<li><p>Get the cluster’s configuration</p>
<pre><code class="lang-bash">kubectl config view
</code></pre>
</li>
<li><p>List the available API resources</p>
<pre><code class="lang-bash">kubectl api-resources
</code></pre>
</li>
<li><p>List everything</p>
<pre><code class="lang-bash">kubectl get all --all-namespaces
</code></pre>
</li>
</ol>
<h2 id="heading-node-management">Node Management</h2>
<ol>
<li><p>List the nodes</p>
<pre><code class="lang-bash">kubectl get node
</code></pre>
</li>
<li><p>Update the taints on nodes</p>
<pre><code class="lang-bash">kubectl taint node &lt;node_name&gt;
</code></pre>
</li>
<li><p>Delete a node</p>
<pre><code class="lang-bash">kubectl delete node &lt;node_name&gt;
</code></pre>
</li>
</ol>
<h2 id="heading-pod-management">Pod Management</h2>
<ol>
<li><p>List pods</p>
<pre><code class="lang-bash">kubectl get pod
</code></pre>
</li>
<li><p>Delete a pod</p>
<pre><code class="lang-bash">kubectl delete pod &lt;pod_name&gt;
</code></pre>
</li>
<li><p>See detailed state of a pods</p>
<pre><code class="lang-bash">kubectl describe pod &lt;pod_name&gt;
</code></pre>
</li>
<li><p>Create a pod</p>
<pre><code class="lang-bash">kubectl create pod &lt;pod_name&gt;
</code></pre>
</li>
<li><p>Run a command for a container inside a pod</p>
<pre><code class="lang-bash">kubectl <span class="hljs-built_in">exec</span> &lt;pod_name&gt; -c &lt;container_name&gt; &lt;<span class="hljs-built_in">command</span>&gt;
</code></pre>
</li>
<li><p>Get interactive shell on a pod</p>
<pre><code class="lang-bash">kubectl <span class="hljs-built_in">exec</span> -it &lt;pod_name&gt; /bin/sh
</code></pre>
</li>
<li><p>See resource usage (CPU/Memory/Storage) for pods</p>
<pre><code class="lang-bash">kubectl top pod
</code></pre>
</li>
<li><p>Add/update the annotations of a pod</p>
<pre><code class="lang-bash">kubectl annotate pod &lt;pod_name&gt; &lt;annotation&gt;
</code></pre>
</li>
<li><p>Add/update the label of a pod</p>
<pre><code class="lang-bash">kubectl label pod &lt;pod_name&gt;
</code></pre>
</li>
</ol>
<h2 id="heading-replication-controllers">Replication Controllers</h2>
<ol>
<li><p>View the list of replication controllers</p>
<pre><code class="lang-bash">kubectl get rc
</code></pre>
</li>
<li><p>View the list of replication controllers by namespace</p>
<pre><code class="lang-bash">kubectl get rc --namespace=<span class="hljs-string">"&lt;namespace_name&gt;"</span>
</code></pre>
</li>
<li><p>Scale a ReplicaSet</p>
<pre><code class="lang-bash">kubectl scale --replicas=&lt;expected_replica_num&gt; replicaset &lt;name&gt;
</code></pre>
</li>
</ol>
<h2 id="heading-deployment-management">Deployment Management</h2>
<ol>
<li><p>List the deployments</p>
<pre><code class="lang-bash">kubectl get deployment
</code></pre>
</li>
<li><p>Show the precise status of single or multiple deployments.</p>
<pre><code class="lang-bash">kubectl describe deployment &lt;deployment_name&gt;
</code></pre>
</li>
<li><p>Edit and update the deployment.</p>
<pre><code class="lang-bash">kubectl edit deployment &lt;deployment_name&gt;
</code></pre>
</li>
<li><p>Create a new deployment</p>
<pre><code class="lang-bash">kubectl create deployment &lt;deployment_name&gt;
</code></pre>
</li>
<li><p>Delete a deployment</p>
<pre><code class="lang-bash">kubectl delete deployment &lt;deployment_name&gt;
</code></pre>
</li>
<li><p>Check the rollout status of a deployment</p>
<pre><code class="lang-bash">kubectl rollout status deployment &lt;deployment_name&gt;
</code></pre>
</li>
<li><p>Display Resource usage (CPU/Memory/Storage) for nodes</p>
<pre><code class="lang-bash">kubectl top node
</code></pre>
</li>
<li><p>See resource allocation per node</p>
<pre><code class="lang-bash">kubectl describe nodes | grep Allocated -A 5
</code></pre>
</li>
<li><p>List the pods running on a node</p>
<pre><code class="lang-bash">kubectl get pods -o wide | grep &lt;node_name&gt;
</code></pre>
</li>
<li><p>To annotate a node</p>
<pre><code class="lang-bash">kubectl annotate node &lt;node_name&gt;
</code></pre>
</li>
<li><p>Add or update the labels of a node</p>
<pre><code class="lang-bash">kubectl label nodes &lt;your-node-name&gt; &lt;label&gt;
</code></pre>
</li>
<li><p>Scale a Deployment</p>
<pre><code class="lang-bash">kubectl scale deployment &lt;deployment-name&gt; --replicas=&lt;number-of-replicas&gt;
</code></pre>
</li>
</ol>
<h2 id="heading-secrets">Secrets</h2>
<ol>
<li><p>Create a secret</p>
<pre><code class="lang-bash">kubectl create secret &lt;name&gt;
</code></pre>
</li>
<li><p>List secrets</p>
<pre><code class="lang-bash">kubectl get secrets
</code></pre>
</li>
<li><p>View details about secrets</p>
<pre><code class="lang-bash">kubectl describe secrets &lt;name&gt;
</code></pre>
</li>
<li><p>Delete a secret</p>
<pre><code class="lang-bash">kubectl delete secret &lt;secret_name&gt;
</code></pre>
</li>
</ol>
<h2 id="heading-services">Services</h2>
<ol>
<li><p>List the services</p>
<pre><code class="lang-bash">kubectl get services
</code></pre>
</li>
<li><p>View the detailed state of a service</p>
<pre><code class="lang-bash">kubectl describe services &lt;name&gt;
</code></pre>
</li>
<li><p>Expose a replication controller, deployment or pod as a new Kubernetes service</p>
<pre><code class="lang-bash">kubectl expose deployment [deployment_name]
</code></pre>
</li>
<li><p>Edit/update the definition of a service</p>
<pre><code class="lang-bash">kubectl edit service &lt;name&gt;
</code></pre>
</li>
</ol>
<h2 id="heading-common-options">Common Options</h2>
<p>Commands in Kubectl can include optional flags.
Here are a few examples of the most popular and helpful ones.</p>
<ol>
<li><p>–o Format of output. (Suppose you wanted to list all of the pods in ps output format with additional information.)</p>
<pre><code class="lang-bash">kubectl get pods -o wide
</code></pre>
</li>
<li><p>Create any resource(pod/replicaset/deployment, etc) using a yaml/json file.</p>
<pre><code class="lang-bash">kubectl apply -f &lt;xyz.yaml&gt;
</code></pre>
</li>
</ol>
<h2 id="heading-noi-dung-tham-khao">Nội dung tham khảo</h2>
<p>Nội dung bài viết này được mình tìm hiểu, tham khảo, đúc kết và tổng hợp lại từ nhiều nguồn. Mọi người có thể xem thêm các bài viết sau: </p>
<ul>
<li>K21Academy - KUBERNETES CHEATSHEET</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Cách khắc phục khi ổ đĩa bị đầy trong quá trình sử dụng Docker?]]></title><description><![CDATA[Nếu bạn thường xuyên build image bằng Docker, thì chắc các bạn cũng để ý khi build lại thì lần sau thường sẽ nhanh hơn phần trước. Nhanh như vậy đó là do Docker đã cache lại để quá trình build image của chúng ta được nhanh hơn.
Tất nhiên cái gì cũng ...]]></description><link>https://tencat.dev/cach-khac-phuc-khi-o-dia-bi-day-trong-qua-trinh-su-dung-docker</link><guid isPermaLink="true">https://tencat.dev/cach-khac-phuc-khi-o-dia-bi-day-trong-qua-trinh-su-dung-docker</guid><category><![CDATA[Devops]]></category><category><![CDATA[Docker]]></category><category><![CDATA[containers]]></category><category><![CDATA[log]]></category><dc:creator><![CDATA[Andreeee]]></dc:creator><pubDate>Sun, 03 Dec 2023 17:00:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1704791957327/da3037b3-725d-4726-a00b-7a3119fddbf8.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Nếu bạn thường xuyên build image bằng Docker, thì chắc các bạn cũng để ý khi build lại thì lần sau thường sẽ nhanh hơn phần trước. Nhanh như vậy đó là do Docker đã cache lại để quá trình build image của chúng ta được nhanh hơn.</p>
<p>Tất nhiên cái gì cũng có cái giá của nó ^^. Mình cũng đã từng gặp trường hợp như vậy khi triển khai dự án ở công ty, mình dựng 1 server GitHub Action self-hosted để chạy CI (Continuous Innovation) build image mới nhất từ Repo mỗi khi đẩy code vào nhánh <code>prod</code>, <code>staging</code> hoặc <code>dev</code>.</p>
<h2 id="heading-truy-tim-giau-vet">Truy tìm giấu vết</h2>
<p>Quá trình này hoạt động cũng được gọi là ổn định cho đến khi 1 vấn đề xảy ra 😒</p>
<pre><code class="lang-plaintext">Error: no space left on device
</code></pre>
<p>Lối bên trên chỉ mang tính chất minh hoạ, nhưng đại loại là lỗi trả về có dạng <code>no space left on device</code>. Ngay lập tức mình kết nối vào server để xem tình hình ra sao. Sau đó chạy lệnh <code>df</code> để kiểm tra disk còn bao nhiêu % ổ đĩa trống.</p>
<pre><code class="lang-bash">ubuntu@builder:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           791M  3.3M  787M   1% /run
/dev/sda2        98G   98G   0     99% /
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           791M  4.0K  791M   1% /run/user/1000
</code></pre>
<p>(Kết quả đã được mình chế cháo lại 😁, nhưng đại loại là sẽ có dạng như vậy) Nhìn kết quả bên trên chắc các bạn cũng sẽ thấy <code>/dev/sda2</code> đang đầy 99%. khi đầy thì cột <code>Used</code> sẽ cao, <code>Avail</code> sẽ thấp và cột <code>Use%</code> sẽ hiển thị % sử dụng ổ đĩa</p>
<p>Tiếp tục kiểm tra kích thước của từng thư mục từ thư mục root</p>
<pre><code class="lang-bash">sudo du -h --max-depth 1 / | sort -gr
</code></pre>
<p>Thấy thư mục <code>/var</code> lớn nhất, check tiếp bên trong thư mục đó.</p>
<pre><code class="lang-bash">sudo du -h --max-depth 1 /var | sort -gr
</code></pre>
<p>Tiếp tục với thư mục <code>/var/lib</code> thì tôi tìm ra thư mục <code>/var/lib/docker</code> nặng nhất, cụ thể lúc đấy khoảng 80GB.</p>
<pre><code class="lang-bash">ubuntu@builder:~$ sudo du -h --max-depth 1 /var/lib/docker
4.0K    /var/lib/docker/runtimes
40G     /var/lib/docker/overlay2
148K    /var/lib/docker/volumes
4.9M    /var/lib/docker/containers
4.0K    /var/lib/docker/tmp
4.0K    /var/lib/docker/swarm
152K    /var/lib/docker/network
56M     /var/lib/docker/image
39M     /var/lib/docker/buildkit
16K     /var/lib/docker/plugins
40G     /var/lib/docker
</code></pre>
<p>Ok vậy đã tìm được nguyên nhân là do docker, bước tiếp theo là xem cái gì dọn dẹp đươc thì dọn dẹp. Các thứ mình nghĩ có thể dọn dẹp được bao gồm:</p>
<ul>
<li><p>Log của các container</p>
</li>
<li><p>Các volume không còn được sử dụng</p>
</li>
<li><p>Các container đã stopped</p>
</li>
<li><p>Các image mà không được sử dụng</p>
</li>
<li><p>Build cache</p>
</li>
</ul>
<p>Tìm được các thứ cần dọn dẹp rồi thì chúng ta bắt đầu dọn dẹp thôi.</p>
<h2 id="heading-xoa-cac-volume-khong-su-dung-nua">Xoá các <code>volume</code> không sử dụng nữa</h2>
<p>Câu lệnh dọn dẹp các <code>volume</code> mà không được sử dụng nữa.</p>
<pre><code class="lang-bash">docker volume prune -f
</code></pre>
<h2 id="heading-xoa-cac-image-khong-su-dung-nua">Xoá các <code>image</code> không sử dụng nữa</h2>
<p>Câu lệnh dọn dẹp các <code>image</code> mà không được sử dụng nữa.</p>
<pre><code class="lang-bash">docker image prune -a -f
</code></pre>
<h2 id="heading-xoa-cac-container-khong-su-dung-nua">Xoá các <code>container</code> không sử dụng nữa</h2>
<p>Câu lệnh dọn dẹp các <code>container</code> mà không được sử dụng nữa.</p>
<pre><code class="lang-bash">docker container prune -f
</code></pre>
<h2 id="heading-xoa-cac-builder-khong-su-dung-nua">Xoá các <code>builder</code> không sử dụng nữa</h2>
<p>Câu lệnh dọn dẹp các <code>builder</code> mà không được sử dụng nữa. (Server builder của mình nặng nhất phần này, vì phải build image liên tục dẫn tới cache làm đầy ổ cứng)</p>
<pre><code class="lang-bash">docker builder prune -a -f
</code></pre>
<h2 id="heading-cau-lenh-giup-don-dep-nhanh-chong-system-prune">Câu lệnh giúp dọn dẹp nhanh chóng <code>system prune</code></h2>
<p>Phiên bản sau này của docker có lệnh <code>docker system prune</code> sẽ tự động làm kha khá các việc dọn dẹp cho chúng ta.</p>
<pre><code class="lang-bash">ubuntu@builder:~$ docker system prune
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to <span class="hljs-built_in">continue</span>? [y/N] y
Deleted Networks:
docker-network_default
Deleted build cache objects:
98jlfzkgw1hjfdk22sd5460x5
3o8xbgqhl6e49n3illj8fenid
o692cdjs4pm8ni4l4rg8v4hpw
pobyjug26w7kddhf68st2sj5t
p3imtyiehrh0pqfptsyfyftaj
...
Total reclaimed space: 80.17GB
</code></pre>
<p>Hoặc chạy lệnh xoá tất cả</p>
<pre><code class="lang-bash">docker system prune -a -f
</code></pre>
<h2 id="heading-xoa-cac-container-logs">Xoá các container logs</h2>
<p>Thứ chiếm dung lượng ổ đĩa tiếp theo là Docker Json Logs, mặc định khi cài Docker thì toàn bộ logs của container sẽ được Docker lưu ở thư mục <code>/var/lib/docker/containers/\*</code> ở dạng json, nếu ta không thường xuyên xóa logs ở thư mục này thì nó sẽ lên tới vài chục hoặc vài trăm GB.</p>
<p>Để xóa logs ở thư mục này ta có vài cách sau:</p>
<ul>
<li><p>Cấu hình crontab</p>
</li>
<li><p>Dùng logrotate</p>
</li>
<li><p>Giới hạn dung lượng logs của container</p>
</li>
</ul>
<p>Dọn dẹp log của container, đơn giản là làm nó trống trơn. (Sử dụng quyền <code>root</code> nếu bị lỗi <code>Permission denied</code> )</p>
<h3 id="heading-xoa-thu-cong-voi-crontab">Xóa thủ công với crontab</h3>
<pre><code class="lang-bash">sudo sh -c <span class="hljs-string">"truncate -s 0 /var/lib/docker/containers/*/*-json.log"</span>
</code></pre>
<p>Cấu hình crontab:</p>
<pre><code class="lang-bash"><span class="hljs-comment"># daily</span>
sudo -s

cat &lt;&lt;EOF &gt; /etc/cron.daily/clear-container-logs
<span class="hljs-comment">#!/bin/sh</span>
truncate -s 0 /var/lib/docker/containers/**/*-json.log
EOF

chmod +x /etc/cron.daily/clear-container-logs
</code></pre>
<h3 id="heading-tu-dong-voi-logrotate">Tự động với logrotate</h3>
<p>Nếu bạn muốn giữ lại logs thì có thể dùng <code>logrotate</code> để tự động giảm dung lượng logs của Docker.</p>
<p>Hầu hết các Linux Distro đều cài sẵn <code>logrotate</code>, cấu hình logrotate cho tệp tin logs của Docker rất đơn giản, ta tạo tệp tin <code>logrotate-container</code> ở thư mục <code>/etc/logrotate.d</code> và dán cấu hình ở dưới vào:</p>
<pre><code class="lang-plaintext">/var/lib/docker/containers/*/*.log {
  rotate 7
  daily
  compress
  missingok
  delaycompress
  copytruncate
}
</code></pre>
<p>Chạy thử:</p>
<pre><code class="lang-bash">logrotate -fv /etc/logrotate.d/logrotate-container
</code></pre>
<p>Măc định logrotate có sẵn crontab nằm ở thư mục <code>/etc/cron.daily</code> để chạy logrotate hằng ngày nên ta không cần phải cấu hình crontab thêm.</p>
<h3 id="heading-gioi-han-dung-luong-logs-cua-container">Giới hạn dung lượng logs của container</h3>
<p>Từ phiên bản 1.8 trở đi thì Docker có sẵn chức năng logrotate cho json logs. Khi chạy container ta thêm vào thuộc tính <code>--log-opt</code> vào để giới hạn dung lượng logs của container.</p>
<pre><code class="lang-bash">docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=5 nginx
</code></pre>
<p>Trong đó:</p>
<ul>
<li><p><code>--log-driver=json-file</code>: Đặt log driver cho container là <code>json-file</code>.</p>
</li>
<li><p><code>--log-opt max-size=10m</code>: Giới hạn kích thước tối đa của mỗi tập tin log là 10 megabytes. Bạn có thể thay đổi giá trị theo nhu cầu của mình.</p>
</li>
<li><p><code>--log-opt max-file=5</code>: Giới hạn số lượng tập tin log tối đa là 5. Khi số lượng tập tin vượt quá giới hạn, các tập tin cũ hơn sẽ bị ghi đè. Bạn có thể thay đổi giá trị theo nhu cầu của mình.</p>
</li>
</ul>
<p>Nếu bạn đang chạy một container đang hoạt động, bạn có thể thay đổi cấu hình log driver bằng cách sử dụng lệnh <code>docker update</code></p>
<pre><code class="lang-bash">docker update --log-opt max-size=10m --log-opt max-file=5 &lt;container_id&gt;
</code></pre>
<p>Nếu ta cần cấu hình cho toàn bộ container thì thêm cấu hình sau vào daemon.json, nằm ở thư mục <code>/etc/docker/</code> trên Linux và ở thư mục <code>C:\ProgramData\docker\config\</code> trên Windows.</p>
<pre><code class="lang-plaintext">{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
</code></pre>
<h2 id="heading-ket-luan">Kết luận</h2>
<p>Trên đây là 1 số cách để tránh và khắc phục khi ổ đĩa bị đầy trong quá trình học tập và sử dụng Docker. Cách khắc phục tuy đơn giản nhưng vấn đề này rất quan trọng nên các bạn hãy cẩn thận chọn cách phù hợp để cấu hình cho máy chủ của mình nhé ^^.</p>
<h2 id="heading-noi-dung-tham-khao">Nội dung tham khảo</h2>
<p>Nội dung bài viết này được mình tìm hiểu, tham khảo, đúc kết và tổng hợp lại từ nhiều nguồn. Mọi người có thể xem thêm các bài viết sau:</p>
<ul>
<li><p>Quân Huỳnh (devopsvn) - <a target="_blank" href="https://devopsvn.tech/devops/lam-the-nao-de-tranh-o-dia-bi-day-khi-xai-docker">Làm thế nào để tránh ổ đĩa bị đầy khi xài Docker?</a></p>
</li>
<li><p>Nguyen Minh Tuan - <a target="_blank" href="https://viblo.asia/p/het-dung-luong-disk-do-chay-docker-trong-thoi-gian-dai-oK9Vyze94QR">Hết dung lượng disk do chạy Docker trong thời gian dài</a></p>
</li>
<li><p>elroydevops - <a target="_blank" href="https://elroydevops.tech/nhung-cach-giup-ban-tranh-bi-day-o-dia-khi-su-dung-docker/">Những nguyên nhân gây ra đầy ổ đĩa khi sử dụng docker?</a></p>
</li>
<li><p><a target="_blank" href="https://stackoverflow.com/questions/42510002/docker-how-to-clear-the-logs-properly-for-a-docker-container">Docker: How to clear the logs properly for a Docker container?</a></p>
</li>
</ul>
]]></content:encoded></item></channel></rss>